(Django) объект типа 'User' не имеет атрибута 'USERNAME_FIELD'
Здесь я пытаюсь создать пользовательскую форму регистрации пользователя и вот какую ошибку я получаю:
Это результат использования 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