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: p> 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. P> Je ne sais pas pourquoi, alors si quelqu'un a une idée, P> Merci. P> p>
4 Réponses :
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 em> 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): p> 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. P> p>
Merci, j'ai utilisé votre solution pour résoudre mon problème: les formulaires vides ne doivent pas valider. Voir mon exemple.
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) 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 . P> Veuillez trouver la description à à l'aide-initial-data-with-a-formset p> p>
@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)
Étant donné que vide_permitted code> est un argument de la méthode init b>, vous pouvez utiliser form_kwargs code> dans votre appel et éviter de créer votre init b> méthode dans votre exemple de sous-classe. Installation_Formset = ModelFormset_Factory (installation, formulaire = InstallationForm) (requête.post, form_kwargs = {'vide_permitted': false}) code>
Notez que form_kwargs est disponible dans Django version 1.9+
simple est meilleur. En raison d'un formulaire est une liste de formulaires, vous pouvez itérer cet ensemble.