Dajax/Dajaxice сохранение объекта в ajax.py с параметрами
Я выполнил настройку и у меня все примеры на dajaxproject.com работают нормально, но теперь у меня возникают проблемы с использованием того, что я узнал в более сложном сценарии использования. Я хотел бы передать несколько параметров функции ajax вместе с текстом из формы и создать объект, используя эти фрагменты данных.
Если кто-нибудь может мне помочь, это будет очень цениться.
Я использую jquery и jquery.ba-serializeobject.min.js.
Ajax.py:
@dajaxice_register
def save_comment(req, form, user_username, other_username):
dajax = Dajax()
comment_form = CreateCommentForm(deserialize_form(form))
if comment_form.is_valid():
text = comment_form.cleaned_data['text']
user = User.objects.get(username=user_username)
other_user = User.objects.get(username=other_username)
other_profile = Profile.objects.get(user=other_user)
comment = other_profile.comments.objects.create(owner=user, text=text)
comment.save()
return dajax.json()
JS:
<script type="text/javascript">
function add_comment(){
var user = '{{ person.user.username }}';
var other = '{{ other.user.username }}';
var data = $('#comment_form').serialize(true);
Dajaxice.profiles.save_comment(Dajax.process, {'form': data, 'user_username': user, 'other_username': other });
return false;
}
</script>
HTML:
<div><h4>Post Comment:</h4>
<div id="comment_form_errors"></div>
<form action="" id="comment_form" accept-charset="utf-8" method="post">
{% csrf_token %}
{{ commentform.as_p }}
<p><input class="btn profile-comment-submit" id="submit_profile_comment" onclick="add_comment()" type="submit" alt="register" /></p>
<form>
</div>
В консоли отладки Chrome единственная ошибка, которую я получаю, это Dajaxice: что-то пошло не так.
Если я пропустил что-нибудь важное, дайте мне знать.
Большое спасибо,
4 ответа
То, как вы отправляете форму, очень важно для Dajax. Мне удалось использовать http://benalman.com/projects/jquery-misc-plugins/ и следующий javascript:
jQuery('form').submit(function(e) {
e.preventDefault()
var data = jQuery(this).serializeObject();
Dajaxice.app.app_name.function_name(Dajax.process,{'form':data});
return false;
});
Немного сложно получить полный обзор проблемы, когда я не вижу вашу форму. Но я бы порекомендовал вам создать форму CommentForm и заполнить user и other_user в скрытых полях при инициализации формы. Это сделает код менее сложным
Ваша функция сохранения будет довольно простой:
@dajaxice_register
def function_name(request, form):
dajax = Dajax()
form = CommentForm(form)
if form.is_valid():
form.save()
return dajax.json()
Есть несколько вещей, которые я могу видеть здесь, но не имея возможности увидеть CreateCommentForm()
и модель, которая создает форму для некоторых из них, может быть основана на предположениях. Также при условии отсутствия проблем с сериализацией формы.
@dajaxice_register
def save_comment(req, form, user_username, other_username):
dajax = Dajax()
user = User.objects.get(username=user_username)
other_user = User.objects.get(username=other_username)
other_profile = Profile.objects.get(user=other_user)
# Required fields of a form must be checked before calling is_valid() or is_valid fails.
comment = Comments(owner=user)
comment_form = CreateCommentForm(deserialize_form(form), instance=comment)
if comment_form.is_valid():
comment_form.save()
dajax.alert('Form is valid')
else:
dajax.alert('Form is invalid')
for error in comment_form.errors:
dajax.add_css_class('#id_%s' % error, 'error')
# Dajax needs something added to it before the dajax.json() can be returned.
return dajax.json()
К фрагменту формы можно обратиться здесь: Django использует подмножество полей в форме, а возвращаемые фрагменты dajax можно увидеть более подробно в этом примере dajax: Пример проверки формы Dajax
Единственное, что выделяется для меня (и я не эксперт, так что, кто знает...), это в вашем ajax.py. Я думаю, что это должно быть:
@dajaxice_register
def save_comment(req, form, user_username, other_username):
dajax = Dajax()
comment_form = CreateCommentForm(deserialize_form(form))
if comment_form.is_valid():
text = comment_form.cleaned_data['text']
user = User.objects.get(username=user_username)
other_user = User.objects.get(username=other_username)
other_profile = Profile.objects.get(user=other_user)
comment = Comment(owner=user, text=text)
comment.save()
other_profile.comments.add(comment)
# I don't think you need to other_profile.save(), but you can if you want
return dajax.json()
Я не нашел способа заставить это работать. Я думаю, что это проблема с Dajaxice, что вы можете сделать, чтобы избежать request.POST QueryDict и вместо этого использовать request.raw_post_data. Вам нужно сделать обратное urlparse:
data = urlparse.parse_qs(request.raw_post_data)
Тогда вам нужно будет десериализовать его.
data = json.loads(data.get('argv'))
Это вернет список аргументов, используйте первый элемент в списке.