在这里,我尝试创建一个自定义用户注册表单,这是我不断收到的错误:
这是我根据许多来源使用 UserCreationForm 代替 forms.ModelForm 的结果。
我尝试设置 USERNAME_FIELD = 用户名,但它说
The field 'username' clashes with the field 'username' from model 'members.user'
在我切换到 UserCreationForm 之前,注册甚至没有创建任何新用户。我成功创建了登录功能,但在注册时失败了。提交注册表后没有任何反应。
我的代码如下:
members/models.py
class User(models.Model):
username = models.CharField(max_length=50, error_messages=login_errors_mess)
password = models.CharField(max_length=50, error_messages=password_errors_mess)
members/forms.py
class RegisterForm(UserCreationForm):
class Meta:
model = User
fields = [
'username', 'password',
]
widgets = {
'username': forms.TextInput(attrs={ 'class': 'form-control', 'data-val': 'true', 'data-val-required': 'Please enter your user name'}),
'password': forms.TextInput(attrs={ 'class': 'form-control', 'data-val': 'true', 'data-val-required': 'Please enter your password' }),
}
members/views.py
def register(request):
form = RegisterForm()
if request.method == "POST":
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('login')
# return redirect('login')
form = RegisterForm()
return render (request, "registration/register.html", context={"form": form})
templates/registration/register.html
<form method="POST" action="/register/">
{% csrf_token %}
{% comment %} {{ form }} {% endcomment %}
<div class="form-group">
<label for="username">Username</label>
<input type="text" class="form-control" name="username" id="username"/>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password"/>
</div>
<button type="submit" class="btn btn-primary btn-flat m-b-30 m-t-30">Register</button>
</form>
urls.py
urlpatterns = [
path('members/', include('members.urls')),
path('admin/', admin.site.urls),
path('', dashboard, name='dashboard'),
path('register/', register, name='register'),
path('login/', login_page, name='login'),
]
你能告诉我如何解决这个问题吗?谢谢!
最佳答案
您应该将字段名称指定为字符串,因此:
class User(models.Model):
username = models.CharField(max_length=50, error_messages=login_errors_mess)
password = models.CharField(max_length=50, error_messages=password_errors_mess)
# not USERNAME_FIELD = username
<b>USERNAME_FIELD = 'username'</b>
但这还不够:用户模型应该实现额外的逻辑,例如检查权限。
Django 文档有一个名为 using a custom user model when starting a project 的部分其中解释了如何设置自定义用户模型。
关于python - (Django) 类型对象 'User' 没有属性 'USERNAME_FIELD',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69690952/