Django шаблон получает значение из внешних ключей без контекста - PullRequest
1 голос
/ 03 мая 2020

У меня есть следующая модель данных:

class Membership(models.Model):
    slug = models.SlugField()
    membership_type = models.CharField(choices=MEMBERSHIP_CHOICES, default='Free', max_length=11)
    price = models.IntegerField(default=50)
    stripe_plan_id = models.CharField(max_length=40)

    def __str__(self):
        return self.membership_type


class UserMembership(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    stripe_customer_id = models.CharField(max_length=40)
    membership = models.ForeignKey(Membership, on_delete=models.SET_NULL, null=True)

На моей панели навигации Я хотел бы показать members_type , если пользователь прошел аутентификацию. Возможно ли это сделать без представления, передающего контекст?

Я попробовал следующее:

{% if request.user.is_authenticated %}
    {{ request.user.usermembership.membership.membership_type }}
    {{ request.user.usermembership_set.membership_set.membership_type }}
{% endif %}

1 Ответ

0 голосов
/ 03 мая 2020

Ну, здесь у пользователя может быть ноль, один или более Membership с, поскольку вы сделали ForeignKey для пользовательской модели, а не OneToOneField. Таким образом, вы можете перебирать объекты UserMembership и отображать .membership_type соответствующего .membership для каждого элемента:

{% for usermembership in request.user<b>.usermembership_set.all</b> %}
    {{ usermembership.membership.membership_type }}
{% endfor %}

или, если вы сделаете это OneToOneField:

class UserMembership(models.Model):
    user = models.<b>OneToOneFied(</b>settings.AUTH_USER_MODEL, on_delete=models.CASCADE<b>)</b>
    stripe_customer_id = models.CharField(max_length=40)
    membership = models.ForeignKey(Membership, on_delete=models.SET_NULL, null=True)

мы можем сделать это с помощью:

{{ request.user<b>.usermembership.membership.membership_type</b> }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...