web-dev-qa-db-fra.com

Django champ obligatoire sous forme de modèle

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?

70
Ryan

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é.

111
DataGreed

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.

17
stefanw

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
4
gitaarik

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. 

3
Tom

À 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 

0
All Іѕ Vаиітy

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

0
Samuel Adam