我已经完成了设置并且让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:出了点问题。
如果我遗漏了一些可能很重要的内容,请告诉我。
非常感谢,
答案 0 :(得分:0)
唯一突出我的(我不是专家,所以谁知道......)就在你的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()
答案 1 :(得分:0)
您发送表单的方式对于Dajax来说是有用的。我已成功使用http://benalman.com/projects/jquery-misc-plugins/#serializeobject和以下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()
答案 2 :(得分:0)
我可以在这里看到一些东西,但是没有能够看到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 using a subset of fields on the form 在这个dajax示例中可以更详细地看到dajax返回部分:Dajax form validation example
答案 3 :(得分:0)
我发现没办法让它发挥作用。我认为这是Dajaxice的一个问题,你可以做的是避免request.POST QueryDict,而是使用request.raw_post_data。您需要执行与urlparse相反的操作:
data = urlparse.parse_qs(request.raw_post_data)
然后你需要反序列化它。
data = json.loads(data.get('argv'))
这将返回一个参数列表,使用列表中的第一个元素。