Django - Различные типы пользователей в DetailView
У меня есть два типа пользователей: Покупатель и Торговец, и я хочу отображать на странице детали выбранного пользователя, но представление деталей может использовать только одну модель
Мои модели
class User(AbstractUser):
is_buyer = models.BooleanField(default=False)
is_merchant = models.BooleanField(default=False)
is_moderator = models.BooleanField(default=False)
pgp = models.CharField(max_length=150, blank=True)
date_created = models.DateTimeField(default=timezone.now)
class Merchant(models.Model): # items
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
def __str__(self):
return f'{self.user.username}'
class Buyer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
pin = models.CharField(max_length=6, blank=True)
def __str__(self):
return f'{self.user.username}'
Мои взгляды
class ProfileDetailView(DetailView):
model = User
template_name = 'users/profile.html'
slug_field = 'username'
slug_url_kwarg = 'username'
Мой шаблон и url
{% extends 'base.html' %}
{% block content %}
<article>
<div>
<p>{{ object.pgp }}</p>
</div>
</article>
{% endblock %}
path('profile/<str:username>', usersViews.ProfileDetailView.as_view(), name='user-profile'),
В шаблоне работает только object.username, если я пытаюсь использовать другие имена, оно не отображается. Что мне делать? Создать другую модель Profile? Изменить текущее представление или модель?
Edit: Я создал модель профиля
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
buyer = models.OneToOneField(Buyer, on_delete=models.CASCADE)
merchant = models.OneToOneField(Merchant, on_delete=models.CASCADE)
def __str__(self):
return self.user.username
но затем в представлении 2 переменные slug
slug_field = 'User.username'
slug_url_kwarg = 'User.username'
вызвана ошибка Generic detail view must be called with either an object pk or a slug
Поскольку между Пользователем, Продавцом и Покупателем существует связь один-к-одному, вы можете получить доступ к обоим в вашем шаблоне:
{{ obj.merchant }}
# or
{{ obj.buyer }}
Затем вы можете получить доступ к свойствам Merchant/Buyer:
{{ obj.merchant.some_property }}