python - (Django) 类型对象 'User' 没有属性 'USERNAME_FIELD'

标签 python django user-registration

在这里,我尝试创建一个自定义用户注册表单,这是我不断收到的错误: enter image description here

这是我根据许多来源使用 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/

相关文章:

python - 如何使用 gensim 在维基百科页面上训练 Word2Vec 模型?

python - 如何将 {} 显示为 python f 字符串的一部分

python - 使用正则表达式拆分 URL

python - Django obj_create 在我的表单验证之前运行

spring - Thymeleaf 注册页面 - 执行处理器 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' 期间出错

Facebook 注册插件 : "invalid_id" when logging out

python - 如何在 heroku 中的 rails 应用程序中运行 python 脚本?

python - Fabric 没有使用正确的 key

python - 将 Django 模板标签 "with"与另一个模板标签的结果一起使用

mysql - 4 位数字用户名 - CakePHP