Как можно автоматически назначить модель пользователю?
Я разрабатываю электронную коммерцию на Django, в которой для добавления товаров в корзину необходимо быть клиентом. Однако вы входите на страницу как пользователь, что не одно и то же. Как можно приписать клиента к пользователю после того, как он будет создан автоматически? Если это невозможно сделать автоматически, то как я могу вставить форму для создания клиента и его привязки к пользователю?
Я вставлю несколько скриншотов модели клиента и представлений, которые имеют значение.
это модель клиента
это функция добавления в корзину в файле views.py
Как вы можете видеть на этом скриншоте, я мог бы вручную связать клиента с уже созданным пользователем, но это было бы неэффективно. Я бы хотел, чтобы при регистрации пользователя, клиент назначался ему автоматически. Спасибо
Вы
Это тривиальный вопрос о расширении модели Django User
. Вы можете понять больше, если поищете о Лучших практиках расширения модели Django User.
Но в целом, есть два общих подхода, которые используют большинство разработчиков:
- Расширение модели
User
путем создания пользовательской модели типаCustomer
, которая наследуется отAbstractUser
. Это решение является наиболее гибким и простым, так как у вас будет та же модель DiangoUser
по умолчанию, но с дополнительными полями, которые вы можете легко добавить в любое время в процессе разработки. Если вам нравится такой подход и он соответствует вашему бизнес-кейсу, вы должны сделать это с самого начала разработки. Или, если вас не волнуют старые миграции, вы можете удалить свою базу данных (если она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
параметр.