Dajax / Dajaxice使用参数在ajax.py中保存对象

时间:2013-02-10 17:02:31

标签: python django jquery dajaxice dajax

我已经完成了设置并且让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 个答案:

答案 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'))

这将返回一个参数列表,使用列表中的第一个元素。