Django Modellform NICHT erforderlich Feld

78

Ich habe eine Form wie diese:

class My_Form(ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

Wie kann ich das Adressfeld als optional festlegen?

Andres
quelle
1
Wie sieht das Modell aus?
Ngenator

Antworten:

94

Schätze, dein Modell ist so:

class My_Class(models.Model):

    address = models.CharField()

Ihr Formular für die Django-Version <1.8:

class My_Form(ModelForm):

    address = forms.CharField(required=False)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

Ihr Formular für Django Version> 1.8:

class My_Form(ModelForm):

    address = forms.CharField(blank=True)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')
Akshar Raaj
quelle
3
Was ist mit dem Fremdschlüsselfeld?
digz6666
16
Verwenden Sie ModelChoiceField. Also, wenn Felddefinitionen ist abc=models.ForeignKey(Abc), können Sie schreibenabc = forms.ModelChoiceField(queryset=Abc.objects.all(), required=False)
Akshar Raaj
2
Stellen Sie sicher, dass Formulare importiert werden, wenn Sie sie zuvor nicht verwendet haben:from django import forms
Justin McCandless
106
class My_Form(forms.ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

    def __init__(self, *args, **kwargs):
        super(My_Form, self).__init__(*args, **kwargs)
        self.fields['address'].required = False
Madzohan
quelle
3
Obwohl die Antwort von akshar besser aussieht, verhindert diese Methode, dass Sie Dinge tun müssen, um Dinge wie help_text und label festzulegen.
Blackeagle52
3
Diese Methode ist besonders hilfreich beim Umgang mit Feldern, die auf Modellebene als FKs definiert sind. Nach der Methode von akshar müsste man das querysetAttribut festlegen .
PritishC
7

Sie müssten hinzufügen:

address = forms.CharField(required=False)
Atma
quelle
4
Die Attribute blank und null werden nicht für ModelForms verwendet
Fernando Ferreira
3
Dies sollte in dem sein Modell Feld, nicht das Formularfeld. null=True, blank=Truewird dazu führen, dass das ModelForm-Feldrequired=False
Anentropic
3

Die Lösung von @ Anentropic aus dem Kommentar zu @ Atmas Antwort hat bei mir funktioniert. Und ich denke, es ist auch das Beste.

Sein Kommentar:

null = True, blank = True bewirkt, dass das ModelForm-Feld erforderlich ist = False

Ich habe es gerade auf meinem ManyToMany-Feld in meiner UserProfileKlasse eingestellt und es hat einwandfrei funktioniert.

Meine UserProfileKlasse sieht jetzt so aus (beachten Sie das friendsFeld):

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField('self', null=True, blank=True)

Ich denke auch , dass dies die schönste Lösung ist , da Sie die gleiche Sache, put tun nullund blankzu True, Wetter Sie haben ein einfaches charFeld oder, wie ich,ManyToMany Feld.

Nochmals vielen Dank @Anentropic. :) :)

PS Ich habe dies als Beitrag geschrieben, da ich keinen Kommentar abgeben konnte (ich habe weniger als 50 Ruf), aber auch, weil ich denke, dass sein Kommentar mehr Aufmerksamkeit erfordert.

PPS Wenn diese Antwort Ihnen geholfen hat, bestätigen Sie bitte seinen Kommentar.

Prost :)

Filip Savic
quelle
2

Lösung: Verwenden Sie beide blank=True, null=True.

my_field = models.PositiveIntegerField(blank=True, null=True)

Erläuterung:

wenn du benutzt null=True

`my_field = models.PositiveIntegerField(null=True)`

dann ist my_field erforderlich, mit * in der Form kann kein leerer Wert übermittelt werden.

wenn du benutzt blank=True

`my_field = models.PositiveIntegerField(blank=True)`

dann ist my_field nicht erforderlich, nein * dagegen in form, du kannst keinen wert einreichen. Wird aber null Feld nicht erlaubt bekommen.

Hinweis:

1) marking as not required and 
2) allowing null field are two different things.

Pro-Tipp:

Read the error more carefully than documentation.
Vishal Singh
quelle
0

Die obigen Antworten sind richtig; Beachten Sie jedoch, dass die Einstellung null=Trueauf einem ManyToManyField keine Auswirkungen auf Datenbankebene hat und bei der Migration die folgende Warnung auslöst:

(fields.W340) null has no effect on ManyToManyField.

Eine gute Antwort darauf wird in diesem anderen Thread erklärt .

adriaanbd
quelle