2010-10-28 28 views
4

J'ai une page d'édition pour mon objet. Comme j'ai divisé les données en deux onglets, j'utilise jquery-ui. Sur le premier onglet (#core_data), je charge les données principales de l'objet. La forme est submited via Ajax:Demandes POST doublées au lieu d'une simple

<form method="post" class="object_form" id="event-core-form" action="{% url edit_event_data event.id %}" enctype="multipart/form-data"> 
    {{ form.as_p }} 
    <p> 
     <input class="object-submit" id="event-data-save" type="submit" value="Save data"> 
    </p> 
</form> 

js:

$("#event-data-save").livequery("click", function() { 
    $("#event-core-form").ajaxSubmit({ 
     "success": function(data) { 
      data = JSON.parse(data) 
      $("#core-data").html(data["form"]);    
     } 
    }); 
    return false; 
}) 

et une fonction est exécutée, et mon débogage dit qu'il est immédiatement appelé 2 fois:

def edit_event_data(request, event_id,): 
    template_name="management/core_event.html" 
    event = get_object_or_404(Event, pk=event_id) 
    form = EventForm(instance=event, data=request.POST) 

    if form.is_valid(): 
     form.save() 
     form = EventForm(instance=event) 

    form_html = render_to_string(template_name, RequestContext(request, { 
     "event" : event, 
     "form" : form, 
    })) 

    result = simplejson.dumps({ 
     "form": form_html, 
     "message": "Data saved." 
    }, cls=LazyEncoder) 

    return HttpResponse(result, mimetype='application/javascript') 

Que, après avoir réussi à frapper en sauvant une fois de plus, il me donne une forme brute rendue:/Voici la forme que j'utilise. Je pense que cela peut être la raison de mes problèmes:

class EventForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     logging.debug("form - init") 
     super(EventForm, self).__init__(*args, **kwargs) 

    (...) 

    def save(self, *args, **kwargs): 
     (...) 

     logging.debug("form - save") 
     post = super(EventForm, self).save(*args, **kwargs) 
     post.save() 

Depuis mon debug je peux voir, je pense que trop de __init__'s

2010-10-28 23:35:08,210 DEBUG form - init 
2010-10-28 23:35:34,065 DEBUG form - init 
2010-10-28 23:35:34,068 DEBUG form - save 
2010-10-28 23:35:34,073 DEBUG form - init 
2010-10-28 23:35:34,258 DEBUG form - init 
2010-10-28 23:35:34,262 DEBUG form - save 
2010-10-28 23:35:34,270 DEBUG form - init 

Quelqu'un peut-il aider?


EDIT:

Après avoir retiré jquery-ui toujours le même. Supprimer LiveQuery ne donne également aucun résultat.

+0

partiellement résolu. Il s'est avéré, j'ai eu l'importation en double avec la fonction d'envoi de données. Maintenant, le formulaire est envoyé une seule fois, mais après avoir renvoyé, je reçois un formulaire html brut. – owca

Répondre

1

Pourquoi instanciez-vous un nouveau formulaire après avoir enregistré l'original?

if form.is_valid(): 
    form.save() 
    # what's the point of the next line? 
    form = EventForm(instance=event) 

C'est presque certainement la cause de votre appel __init__ double. Pourquoi fais-tu ça? Vous avez déjà un formulaire. En outre, vous avez oublié d'arrêter l'action de clic dans votre JS.

$("#event-data-save").livequery("click", function(e) { 
    e.preventDefault(); 
    ... 
})