Как можно автоматически назначить модель пользователю?

Я разрабатываю электронную коммерцию на Django, в которой для добавления товаров в корзину необходимо быть клиентом. Однако вы входите на страницу как пользователь, что не одно и то же. Как можно приписать клиента к пользователю после того, как он будет создан автоматически? Если это невозможно сделать автоматически, то как я могу вставить форму для создания клиента и его привязки к пользователю? Я вставлю несколько скриншотов модели клиента и представлений, которые имеют значение. enter image description here

это модель клиента

это функция добавления в корзину в файле views.py

enter image description here Как вы можете видеть на этом скриншоте, я мог бы вручную связать клиента с уже созданным пользователем, но это было бы неэффективно. Я бы хотел, чтобы при регистрации пользователя, клиент назначался ему автоматически. Спасибо Вы

Это тривиальный вопрос о расширении модели Django User. Вы можете понять больше, если поищете о Лучших практиках расширения модели Django User.

Но в целом, есть два общих подхода, которые используют большинство разработчиков:

  • Расширение модели User путем создания пользовательской модели типа Customer, которая наследуется от AbstractUser. Это решение является наиболее гибким и простым, так как у вас будет та же модель Diango User по умолчанию, но с дополнительными полями, которые вы можете легко добавить в любое время в процессе разработки. Если вам нравится такой подход и он соответствует вашему бизнес-кейсу, вы должны сделать это с самого начала разработки. Или, если вас не волнуют старые миграции, вы можете удалить свою базу данных (если она sqlite) и удалить все файлы миграций, и сделать новую python manage.py makemigrations после внедрения указанного решения. Кроме того, это лучший подход, если вы хотите добавить что-то вроде device параметра, который вы хотите, чтобы пользователь добавил его непосредственно при регистрации.

AbstractUser подход:

from django.contrib.auth.models import AbstractUser

class Customer(AbstractUser):
    device = models.CharField(max_length=200, blank=True)
  • Второй подход - это почти то, что вы сделали, но он требует более тщательной работы (и, конечно, зависит от вашего бизнес-кейса). Речь идет о создании новой модели типа Customer, которая расширяет модель User с помощью отношений один-к-одному. Затем вы можете выполнять автосоздание и автосохранение модели Customer параллельно с моделью User с помощью signals, выполнив следующие действия

Ваш подход:

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    device = models.CharField(max_length=200, blank=True)

@receiver(post_save, sender=User)
def create_user_customer(sender, instance, created, **kwargs):
    if created:
        Customer.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_customer(sender, instance, **kwargs):
    instance.customer.save()

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

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