11
votes

Django et le format vide sont valides

J'ai un petit problème avec le format de format.

Je dois afficher plusieurs constructeurs automatiques dans une page, et chaque formulaire comporte plusieurs formes. Donc, j'ai fait quelque chose comme ça: xxx

Le problème est que je soumets la page, les formulaires de vide sont "automatiquement" valides (sans chèque), Mais si je remplis un champ dans une forme d'une seule forme, le chèque fonctionne dessus.

Je ne sais pas pourquoi, alors si quelqu'un a une idée,

Merci.


0 commentaires

4 Réponses :


23
votes

J'ai rencontré cette question tout en recherchant un autre problème. En creusant la source de Django à la recherche d'une solution à mon problème, j'ai trouvé la réponse à cette question, donc je vais le documenter ici:

Lorsqu'un formulaire est autorisé à avoir des valeurs vides (ceci s'applique aux formulaires vides contenus dans Un format) et Les valeurs soumises n'ont pas été modifiées à partir des initiales, la validation est ignorée. Vérifiez la méthode FULL_CLEAN () dans django / formulaires / formulaires.py (ligne 265 dans django 1.2): xxx

Je ne suis pas sûr de quel genre de solution vous cherchez Pour (aussi, cette question est déjà quelque peu datée) mais peut-être que cela aidera quelqu'un à l'avenir.


1 commentaires

Merci, j'ai utilisé votre solution pour résoudre mon problème: les formulaires vides ne doivent pas valider. Voir mon exemple.



2
votes

Les formulaires créés en fonction du paramètre "extra" de "formset_factory" ont leur propriété "vide_permited" définie sur true. (Voir: formset.py Line 123) XXX

Donc, il semble donc utiliser le meilleur moyen d'utiliser le paramètre "Initial" du formulaire et non du paramètre "Extra" de "formset_factory" pour ce cas d'utilisation .

Veuillez trouver la description à à l'aide-initial-data-with-a-formset


0 commentaires

14
votes

@jonas, merci. J'ai utilisé votre description pour résoudre mon problème. J'avais besoin de la forme d'un formulaire pour ne pas valider quand vide. (Formulaires ajoutés avec JavaScript)

class FacilityForm(forms.ModelForm):
    class Meta:
        model = Facility

    def __init__(self, *arg, **kwarg):
        super(FacilityForm, self).__init__(*arg, **kwarg)
        self.empty_permitted = False


 facility_formset = modelformset_factory(Facility, form=FacilityForm)(request.POST)


2 commentaires

Étant donné que vide_permitted est un argument de la méthode init , vous pouvez utiliser form_kwargs dans votre appel et éviter de créer votre init méthode dans votre exemple de sous-classe. Installation_Formset = ModelFormset_Factory (installation, formulaire = InstallationForm) (requête.post, form_kwargs = {'vide_permitted': false})


Notez que form_kwargs est disponible dans Django version 1.9+



0
votes

simple est meilleur. En raison d'un formulaire est une liste de formulaires, vous pouvez itérer cet ensemble. xxx


0 commentaires