Ich habe User
Modells Django und es hat required=False
. Also, ich denke, Sie können nicht erreichen, was Sie suchen mit dem Standard-Benutzermodell basierend auf note section von "Überschreiben der Standardfelder" in der Django-Dokumentation. Ich habe das Snippet mit eingeschlossen
ModelForm ist ein reguläres Formular, das automatisch bestimmte Felder erzeugen kann. Die Felder, die automatisch generiert werden, hängen vom Inhalt der Meta-Klasse ab und davon, welche Felder bereits deklarativ definiert wurden. Im Grunde erzeugt ModelForm nur Felder , die im Formular fehlen, oder mit anderen Worten, Felder, die nicht deklarativ definiert wurden.
Felder, die deklarativ definiert werden, bleiben wie sie sind, daher werden Anpassungen an Meta-Attributen wie Widgets, Beschriftungen, help_texts oder error_messages ignoriert; Diese gelten nur für Felder , die automatisch generiert werden.
In ähnlicher Weise zeichnen Felder deklarativ definiert ihre Attribute wie max_length oder erforderlich aus dem entsprechenden Modell. Wenn Sie möchten, dass das im Modell angegebene Verhalten verwaltet, müssen Sie die relevanten Argumente explizit angeben, wenn Sie das Formularfeld deklarieren.
Zum Beispiel, wenn der Artikel Modell wie folgt aussieht:
class Article(models.Model):
headline = models.CharField(
max_length=200,
null=True,
blank=True,
help_text='Use puns liberally',
)
content = models.TextField() and you want to do some custom validation for headline, while keeping the blank and help_text values
wie angegeben, Sie ArticleForm wie folgt definieren könnte:
class ArticleForm(ModelForm):
headline = MyFormField(
max_length=200,
required=False,
help_text='Use puns liberally',
)
class Meta:
model = Article
fields = ['headline', 'content'] You must ensure that the type of the form field can be used to set the contents of the corresponding
Modellfeld. Wenn sie nicht kompatibel sind, erhalten Sie einen ValueError , da keine implizite Konvertierung stattfindet.
diese So versuchen,
from django.forms import EmailField
from django.core.validators import EMPTY_VALUES
# I used django [emailfield code][2] as reference for the code of MyEmailField
# Also, following comment in django [custom form fields document][2]:
# If the built-in Field classes don’t meet your needs, you can easily create custom Field classes. To do this, just create a subclass of django.forms.Field. Its only requirements are that it implement a clean() method and that its __init__() method accept the core arguments mentioned above (required, label, initial, widget, help_text).
# You can also customize how a field will be accessed by overriding get_bound_field().
class MyEmailField(forms.EmailField):
def __init__(self, *args, **kwargs):
super(MyEmailField, self).__init__(*args, strip=True, **kwargs)
# Clean would be called when checking is_clean
def clean(self,value):
if value in EMPTY_VALUES:
raise Exception('Email required')
value = self.value.strip()
return super(MyEmailField, self).clean(value)
class MyRegistrationForm(UserCreationForm):
captcha = NoReCaptchaField()
# All available arguments listed in django [core fields argument document][2]. Currently they are required, label, label_suffix, initial, widget, help_text, error_messages, validators, localize, disabled
email = MyEmailField(required=True)
class Meta:
model = User
fields = ('first_name', 'last_name', 'username', 'email', 'password')
# other part of your code
PS: Ich habe diesen Code nicht getestet, aber auf der Grundlage der Dokumentation ich denke, das Sie in eine gute Richtung nehmen sollte.
paar Referenzen:
Django auth.user with unique email
How to make email field unique in model User from contrib.auth in Django
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html
https://docs.djangoproject.com/en/1.10/ref/forms/fields/ #erforderlich – Shubhamoy