python - 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>
以及它在最终用户界面中的样子:
所以整个问题在于那个额外的电子邮件字段
解决方案
由于您的SignUpForm
类继承自UserCreationForm
您,因此应该只提供其他字段,而不是曾经在UserCreationForm
.
因此,在您的情况下,您必须从类(在您的类中)email
的字段数组中删除,如下所示:meta
SignUpForm
class Meta:
model = UserModel
fields = ('name', 'password1', 'password2', )
那么您应该在表单中只有 1 个电子邮件字段。
推荐阅读
- excel - 如果满足条件,则在 SUMIF 公式中切换总和列
- ffmpeg - 如何使用 libx264 静态库编译 ffmpeg?
- qt - ScrollView 内的 ColumnLayout 内的 ListView 未填充可用的高度/宽度
- python - /目录/处的编程错误
- excel - 保护excel的方法vba硬盘序列号
- django - 获取 django.db.utils.IntegrityError: 重复键值违反唯一约束但值不存在
- node.js - 将base64图像转换为URL
- security - 如何阻止远程代码执行漏洞 Nginx?
- javascript - React native - 获取当前月份并将其设置为 Graph
- sql - 如何优化这个以减少执行时间