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)

Я все еще не уверен, что это лучший способ, но, кажется, он работает.

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