J'ai un formulaire dans lequel quelques champs sont renseignés comme requis lorsque je ne les veux pas aussi. Voici le formulaire de models.py
class CircuitForm(ModelForm):
class Meta:
model = Circuit
exclude = ('lastPaged',)
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
self.fields['begin'].widget = widgets.AdminSplitDateTime()
self.fields['end'].widget = widgets.AdminSplitDateTime()
Dans le modèle de circuit actuel, les champs sont définis comme suit:
begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)
Mon point de vue.py pour ceci est ici:
def addCircuitForm(request):
if request.method == 'POST':
form = CircuitForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/sla/all')
form = CircuitForm()
return render_to_response('sla/add.html', {'form': form})
Que puis-je faire pour que les deux champs ne soient pas obligatoires?
Si vous ne souhaitez pas modifier les paramètres vides de vos champs dans les modèles (sinon, la validation normale dans le site d'administration sera interrompue), vous pouvez procéder comme suit dans votre classe Form:
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
Le constructeur redéfini ne nuira à aucune fonctionnalité.
Si le champ du modèle a la valeur vide = True, required est défini sur False dans le champ de formulaire. Sinon, requis = True
C'est ce que dit: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
On dirait que vous faites bien les choses ... vous pouvez vérifier la valeur de self.fields['end'].required
.
En développant la réponse de DataGreed, j'ai créé un Mixin qui vous permet de spécifier une variable fields_required
sur la classe Meta
comme ceci:
class MyForm(RequiredFieldsMixin, ModelForm):
class Meta:
model = MyModel
fields = ['field1', 'field2']
fields_required = ['field1']
C'est ici:
class RequiredFieldsMixin():
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
fields_required = getattr(self.Meta, 'fields_required', None)
if fields_required:
for key in self.fields:
if key not in fields_required:
self.fields[key].required = False
Ce n'est pas une réponse, mais pour quiconque trouve cela via Google, une dernière donnée: c'est ce qui m'arrive sur un formulaire type avec un DateField. La valeur requise est False, le modèle a "null = True, blank = True" et le champ du formulaire indique required = False si je l'examine au cours de la méthode clean (), mais cela indique toujours qu'il me faut une date valide. format. Je n'utilise aucun widget spécial et j'obtiens le message "Entrez une date valide" même si je définis explicitement input_formats = ['% Y-% m-% d', '% m /% d /% Y', ' % m /% d /% y ',' '] sur le champ de formulaire.
EDIT: Je ne sais pas si cela aidera quelqu'un d'autre, mais j'ai résolu le problème que je rencontrais. Notre formulaire contient du texte par défaut dans le champ (dans ce cas, le mot "à" pour indiquer que le champ est la date de fin; le champ s'appelle "heure_fin"). Je recherchais en particulier le mot "to" dans la méthode clean () du formulaire (j'avais également essayé la méthode clean_end_time (), mais il n'a jamais été appelé) et je définissais la valeur de la variable clean_data à None comme suggéré dans ce billet Django . Cependant, rien de tout cela importait, car (je suppose) la validation du modèle avait déjà annulé le format de date non valide de "to" sans me donner une chance de l'intercepter.
À partir de la documentation de terrain modèle ,
Si vous avez un modèle comme indiqué ci-dessous,
class Article(models.Model):
headline = models.CharField(
max_length=200,
null=True,
blank=True,
help_text='Use puns liberally',
)
content = models.TextField()
Vous pouvez modifier la validation du formulaire du titre en required=True
au lieu de blank=False
comme celle du modèle définissant le champ comme indiqué ci-dessous.
class ArticleForm(ModelForm):
headline = MyFormField(
max_length=200,
required=False,
help_text='Use puns liberally',
)
class Meta:
model = Article
fields = ['headline', 'content']
Alors répondant à la question,
class CircuitForm(ModelForm):
begin = forms.DateTimeField(required=False)
end = forms.DateTimeField(required=False)
class Meta:
model = Circuit
exclude = ('lastPaged',)
cela fait begin
et end
à required=False
Ceci est un bug lors de l'utilisation des widgets:
contournement: Utilisation des widgets heure/date de Django dans un formulaire personnalisé
ou billet 12303