71 votes

Django champ requis dans le modèle de formulaire

J'ai un formulaire où un couple de champs sont à venir que lorsque je ne veux pas trop. Voici le formulaire à partir 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, les champs sont définis comme ceci:

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)

Mon views.py pour c'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 en sorte que les deux champs ne sont pas obligatoires?

111voto

DataGreed Points 1675

Si vous ne voulez pas modifier vide pour votre champs à l'intérieur de modèles (cela interrompt normal de validation dans l'admin du site), vous pouvez effectuer les opérations suivantes dans votre classe de la Forme:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False

La redéfinition constructeur ne nuira pas à toutes les fonctionnalités.

17voto

stefanw Points 5951

Si le modèle de champ est vide=True, alors requise est définie sur False dans le champ de formulaire. Sinon, required=True

Le dit ici: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

On dirait que vous faites tout droit. Vous pouvez vérifier la valeur de self.fields['end'].required.

3voto

Tom Points 7393

Ce n'est pas une réponse, mais pour quelqu'un d'autre qui trouve via Google, un peu plus de données: ce qui se passe pour moi sur un Modèle de Formulaire avec un DateField. Il a requis la valeur False, le modèle a "null=True, vide=True" et le champ dans le formulaire de montre required=False si je regarde les cours de la méthode clean (), mais il est encore en disant: j'ai besoin d'une date valide format. Je ne suis pas spécial widget et j'ai l' "Entrer une date valide" message même quand je définir explicitement input_formats=['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', "] sur le champ de formulaire.

EDIT: Ne sais pas si ça va aider quelqu'un d'autre, mais j'ai résolu le problème que j'ai. Notre formulaire a un texte par défaut dans le champ (dans ce cas, le mot "pour" pour indiquer que le champ est la date de fin; le champ est appelé "end_time"). Particulier, j'ai été à la recherche pour le mot "pour" dans la forme de la méthode clean () (j'avais aussi essayé la clean_end_time() la méthode, mais ça n'a jamais été appelé) et le réglage de la valeur de la clean_data variable à Aucun comme il est suggéré dans ce Django billet. Cependant, rien de tout cela importait que (je suppose) le modèle de validation avait déjà vomi sur le format de date invalide "à" sans me donner une chance de l'intercepter.

0voto

anteatersa Points 684

J'ai ce même problème, j'ai un champ de modèle avec vide définie sur false. Le modelform permettra d'économiser de vide, mais lorsque j'ajoute le AdminSplitDateTime widget-je obtenir le "Entrez une date/heure valide." message. Ce doit être un bug.

0voto

Samuel Adam Points 81

C'est un bug lors de l'utilisation des widgets:

solution de contournement: http://stackoverflow.com/questions/38601/using-django-time-date-widgets-in-custom-form/1833247#1833247

ou un billet 12303

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: