首页 > 解决方案 > Django 自定义登录表单显示额外字段

问题描述

我已经创建了 Django 自定义登录表单,但它显示了 2 次电子邮件字段并且无法验证。这是我的文件:

网址.py

path('login/', views.login, name='login'),

models.py在哪里创建了 modeluser 表:

class UserModelManager(BaseUserManager):
    def create_user(self, email, password, pseudo):
        user = self.model()
        user.name = name
        user.email = self.normalize_email(email=email)
        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, email, password):
        '''
        Used for: python manage.py createsuperuser
        '''
        user = self.model()
        user.name = 'admin-yeah'
        user.email = self.normalize_email(email=email)
        user.set_password(password)

        user.is_staff = True
        user.is_superuser = True
        user.save()

        return user


class UserModel(AbstractBaseUser, PermissionsMixin):
    ## Personnal fields.
    email = models.EmailField(max_length=254, unique=True)
    name = models.CharField(max_length=16)
    ## [...]

    ## Django manage fields.
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELD = ['email', 'name']

    objects = UserModelManager()

    def __str__(self):
        return self.email

    def get_short_name(self):
        return self.name[:2].upper()

    def get_full_name(self):
        return self.name

表格.py

class SignUpForm(UserCreationForm):
    email = forms.EmailField(required=True, help_text='البريد الإلكترونى الخاص بك - يجب ان يكون حقيقى (يستخدم لتسجيل الدخول) ')
    name = forms.CharField(required=True, help_text='إسمك الحقيقى -  سيظهر كأسم البائع')
    password1 = forms.CharField(widget=forms.PasswordInput,
                                help_text='كلمة المرور - حاول ان تكون سهلة التذكر بالنسبة لك')
    password2 = forms.CharField(widget=forms.PasswordInput,
                                help_text='تأكيد كلمة المرور - إكتب نفس كلمة المرور السابقة مرة أخرى')

    class Meta:
        model = UserModel
        fields = ('email','name',  'password1', 'password2', )
        labels = {
            'name': 'إسمك الحقيقى -  سيظهر كأسم البائع',
            'email': 'البربد الإلكترونى Email',
            'password1': 'كلمة المرور',
            'password2': 'تأكيد كلمة المرور'
        }


    def clean_email(self):
        data = self.cleaned_data['email']
        return data.lower()


class LoginForm(AuthenticationForm):
    email = forms.EmailField(required=True)
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = UserModel
        fields = ('email', 'password')

    def clean_email(self):
        data = self.cleaned_data['email']
        return data.lower()

这里是views.py和为用户显示表单的html模板:

首先.. Views.py

def login(request):
    if request.method == 'POST':
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            login_form.save()
            username = login_form.cleaned_data.get('username')
            raw_password = login_form.cleaned_data.get('password')
            user = authenticate(username=username, password=raw_password)
            return redirect('home')
    else:
        login_form = LoginForm()

    context = {
        'login_form': login_form,
    }
    return render(request, 'fostania_web_app/login.html', context)

然后是HTML文件:

      <form method="post" align="right">
{% csrf_token %}
          {{ login_form }}
              <button type="submit" class="btn btn-success" style="background: linear-gradient(to right, #ff00a4 , #871f78);border-color: #871f78;">تسجيــل</button><br>
            </form>

以及它在最终用户界面中的样子:

在此处输入图像描述

所以整个问题在于那个额外的电子邮件字段

标签: pythondjango

解决方案


由于您的SignUpForm类继承自UserCreationForm您,因此应该只提供其他字段,而不是曾经在UserCreationForm.

因此,在您的情况下,您必须从类(在您的类中)email的字段数组中删除,如下所示:metaSignUpForm

class Meta:
        model = UserModel
        fields = ('name',  'password1', 'password2', )

那么您应该在表单中只有 1 个电子邮件字段。


推荐阅读