(Django) объект типа 'User' не имеет атрибута 'USERNAME_FIELD'

Здесь я пытаюсь создать пользовательскую форму регистрации пользователя и вот какую ошибку я получаю: enter image description here

Это результат использования UserCreationForm вместо forms.ModelForm, согласно многим источникам.

Я пытался установить USERNAME_FIELD = username, но он сказал

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
    USERNAME_FIELD = 'username'

Однако этого недостаточно: модель пользователя должна реализовывать дополнительную логику, например, для проверки прав доступа.

В документации Django есть раздел использование пользовательской модели пользователя при запуске проекта, в котором объясняется, как установить пользовательскую модель пользователя.

Вероятно, вам стоит рассмотреть возможность использования пакета allauth и сэкономить свое время, потому что большинство вещей, которые вы хотите сделать, уже реализованы. https://github.com/pennersr/django-allauth

Вернуться на верх