2016-11-18 11 views
0

Ich bin ein Neuling in Django. Ich möchte das E-Mail-Feld in der Unterklasse UserCreationForm benötigt werden. Ich habe die kommentierten Methoden ausprobiert, aber bisher hat noch keiner funktioniert. Ich habe die Lösung aus this aber vergeblich versucht. Jede Hilfe wäre willkommen.Wie man UserCreationForm email Feld benötigt

class MyRegistrationForm(UserCreationForm): 
    captcha = NoReCaptchaField() 
    #email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'class': 'mdl-textfield__input'})) 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'username', 'email', 'password') 
     #email = { 
     # 'required': True 
     #} 
     widgets = { 
      'first_name': forms.TextInput(attrs={'class': 'mdl-textfield__input'}), 
      'last_name': forms.TextInput(attrs={'class': 'mdl-textfield__input'}), 
      'username': forms.TextInput(attrs={'class': 'mdl-textfield__input'}), 
      #'email': forms.TextInput(attrs={'class': 'mdl-textfield__input'}) 
     } 

    def save(self, commit=True): 
     user = super(MyRegistrationForm, self).save(commit=False) 
     user.first_name = self.cleaned_data["first_name"] 
     user.last_name = self.cleaned_data["last_name"] 
     user.username = self.cleaned_data["username"] 
     user.email = self.cleaned_data["email"] 
     #user.user_level = self.cleaned_data["user_level"] 
     if commit: 
      user.save() 

     return user 

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

     self.fields['password1'].widget.attrs['class'] = 'mdl-textfield__input' 
     self.fields['password2'].widget.attrs['class'] = 'mdl-textfield__input' 
     #self.fields['email'].required=True 

Antwort

1

Dies löste das Problem: email = forms.CharField(required=True, widget=forms.EmailInput(attrs={'class': 'validate',}))

+0

https://docs.djangoproject.com/en/1.10/ref/forms/fields/ #erforderlich – Shubhamoy

0

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

Verwandte Themen