2009-12-22 5 views
2

Je suis en train de remplir un Django Formset à l'aide des données à partir d'une requête POST. Je suis en mesure d'afficher le formset correctement et instancier encore la plupart du temps bien, mais je vais avoir un problème où la formset se termine avec 2 lignes vides à la fin, ce qui est indésirable. Voici la fonction que nous utilisons dans views.py:Ajout de nouvelles formes à un Django Formset basé sur des données POST

forms.py

class DepositForm(forms.Form): 
    InsID = forms.IntegerField() 
    DepositTypeID = forms.IntegerField() 
    DepositAmount = forms.IntegerField() 
    Account = forms.IntegerField() 

DepositFormSet = formset_factory(DepositForm, extra=1) 

views.py

def _DepositEditor(request, c): 
    if request.POST.has_key('form-0-InsID'): 
     formset = DepositFormSet(request.POST) 
     if formset.is_valid(): 
      formset = DepositFormSet(initial=formset.cleaned_data) 
    else: 
     formset = DepositFormSet() 
    c['formset'] = formset 

    return render_to_response('deposits/dep.html', c) 

dep.html

<form action="" method="post"> 

{{formset.management_form}} 
{% for form in formset.forms %} 
    {{form.errors }} 
    {% for field in form %} 
     {{field.label}}: {{field}} 
    {% endfor %} 
    <br /> 
{% endfor %} 

<input type="submit" name="add" value="Add Deposit"></input> 

</form> 

Cela devrait être tout le code pertinent. Quoi qu'il en soit, le modèle affiche tout le formset, qui doit inclure une ligne vide (ou, dans le cas d'une erreur, pas de lignes vides mais des messages d'erreur au-dessus de la dernière ligne). Le problème se produit lorsque vous cliquez sur "Ajouter" avec la dernière ligne vide. Dans le code, cela passe toujours formset.is_valid(), il crée alors le nouveau formset avec un champ supplémentaire. Si vous cliquez sur ajouter ici, il retourne avec des erreurs, mais vous permet quand même de remplir tout sauf la dernière ligne et de faire un formset valide. Existe-t-il un moyen de dire à mon formset que les formulaires vierges devraient échouer à la validation? Ou alternativement est-il meilleur moyen de faire ceci? La page est finalement prévue pour intégrer certains trucs de jquery, alors que ce n'est pas idéal, s'il y a un bon moyen de résoudre ce problème en utilisant des outils jquery qui seraient probablement assez bons. Merci beaucoup!

Répondre

2

Dans votre views.py:

-   formset = DepositFormSet(initial=formset.cleaned_data) 
+   data = formset.cleaned_data 
+   if data[-1]=={}: 
+    data=data[:-1] 
+   formset = DepositFormSet(initial=data) 

Il ressemble beaucoup à une caractéristique que comme un bogue;)

+0

cela semble avoir fait. Merci beaucoup! –

+0

Vous êtes les bienvenus :) –

Questions connexes