2013-02-10 4 views
1

Я прошел через настройку и все примеры на dajaxproject.com работают нормально, но теперь у меня проблемы с использованием того, что я узнал в более сложном случае использования , Я хотел бы передать несколько параметров функции ajax вместе с текстом из формы и создать объект, используя эти фрагменты данных.Dajax/Dajaxice сохранение объекта в ajax.py с параметрами

Если кто-нибудь может мне помочь, это было бы очень оценено.

Я использую 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 ONl y ошибка, которую я получаю, это Dajaxice: что-то пошло не так.

Если я оставил все, что может быть важно, дайте мне знать.

Большое спасибо,

+0

Это может происходить из-за того, как вы создаете и передаете объект JSON. Попробуйте JSON.stringify() fuction на вашем объекте данных (var data = JSON.stringify ($ ('# comment_form'). Serialize (true))). Я не использовал JQuery, поэтому я мог бы что-то упустить, но у меня есть веские основания подозревать, что это вызвано тем, как вы создаете и передаете объект JSON. – MRashid

ответ

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() 
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 и заполнить пользователя и other_user в скрытых полях при инициализации формы. Это сделает код менее сложным

Вашей функции сохранения, то будет достаточно просто:

@dajaxice_register 
def function_name(request, form): 
    dajax = Dajax() 

    form = CommentForm(form) 

    if form.is_valid(): 
     form.save() 
    return dajax.json() 
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

0

Я не нашел никакого способа заставить его работать. Я думаю, что это проблема с Dajaxice, вы можете сделать это, чтобы избежать запроса. POST QueryDict и вместо этого использовать request.raw_post_data. Вам нужно будет сделать обратную связь с urlparse:

data = urlparse.parse_qs(request.raw_post_data) 

Тогда вам нужно будет десериализовать его.

data = json.loads(data.get('argv')) 

Это вернет список аргументов, используя первый элемент в списке.