Как автоматически проставлять юзернейм?

В Django вы можете автоматически проставлять юзернейм при создании пользователя с использованием сигналов и переопределения метода save() модели пользователя.

1. Подключение сигналов:
Создайте файл signals.py внутри вашего приложения Django (например, app_name/signals.py) и импортируйте модуль следующим образом:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.contrib.auth.models import User

2. Создание функции-обработчика сигнала:
Создайте функцию, которая будет автоматически проставлять юзернейм перед сохранением пользователя:

@receiver(pre_save, sender=User)
def set_username(sender, instance, **kwargs):
    # Проверяем, что у пользователя нет юзернейма
    if not instance.username:
        # Генерируем юзернейм на основе имени и фамилии
        username = f"{instance.first_name.lower()}.{instance.last_name.lower()}"
        
        # Проверяем, что такого юзернейма еще нет в системе
        while User.objects.filter(username=username).exists():
            # Добавляем случайное число к юзернейму при необходимости
            username += f".{random.randint(1000, 9999)}"
        
        # Сохраняем юзернейм
        instance.username = username

3. Регистрация сигнала:
Вызовите функцию регистрации сигнала в файле приложения app_name/apps.py:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'app_name'

    def ready(self):
        import app_name.signals

4. Применение изменений:
Добавьте app_name.apps.MyAppConfig в параметр INSTALLED_APPS в файле settings.py вашего проекта Django.

Теперь, при сохранении нового экземпляра модели User, функция set_username будет вызываться автоматически и проставлять непустой юзернейм на основе имени и фамилии. Если такой юзернейм уже есть в системе, функция будет добавлять случайное число в конец до тех пор, пока не будет найдено уникальное значение.