Django: Как автоматически генерировать USERNAME_FIELD пользовательской модели пользователя?
Это учебный проект, и я пытаюсь создать пользовательскую модель пользователя с возможностью иметь несколько учетных записей с одним и тем же nickname. USERNAME_FIELD
будет username = f"{nickname}#{random_number}"
(как в формате Blizzard и Discord), но я не могу понять, на каком шаге я должен включить функцию, которая будет автоматически создавать имя пользователя.
Я пробовал генерировать имя пользователя в методе CustomAccountManager.create_user()
, но, похоже, он не вызывается при заполнении RegistrationForm
из представления и не удается создать суперпользователя с помощью manage.py createsuperuser
(TypeError: create_superuser() got an unexpected keyword argument 'username'
). Буду рад, если кто-нибудь объяснит, как действовать в этом случае или даст ссылку на ресурс, я не смог найти ни одного с подобным примером. Любое дополнительное понимание кода будет оценено по достоинству.
Я зарегистрировал модель в admin.py с помощью admin.site.register(Account)
, включил приложение счетов в настройки и установил AUTH_USER_MODEL = 'account.Account'
account/models.py
account/views.py:
from django.http.request import HttpRequest
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate, get_user_model
from account.forms import RegistrationForm
from account.models import Account
def RegistrationView(request):
context = {}
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return redirect('index')
else:
context['registration_form'] = form
elif request.method == 'GET':
form = RegistrationForm()
context['registration_form'] = form
return render(request, 'account/registration.html', context)
account/forms.py
from django.contrib.auth.forms import UserCreationForm
from django.forms import ModelForm
from django.core.exceptions import ValidationError
from .models import Account
class RegistrationForm(UserCreationForm):
class Meta:
model = Account
fields = ("email", "nick", 'password1', 'password2',
"first_name", "second_name", "last_name")
Я переписал метод save()
в модели Account таким образом:
def save(self, *args, **kwargs):
if not int(self.user_id):
self.user_id = self.generate_id(self.nick) # moved from CustomAccountManager class
self.username = f"{self.nick}#{self.user_id}"
super().save(*args, **kwargs)
Я все еще не уверен, что это лучший способ, но, кажется, он работает.