Доступ к полю из модели, связанной с другой моделью, с помощью функции get_context_data()

У меня есть следующие модели в моем приложении Django:

  • Model User
class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField('username', max_length=30, blank=True)
    email = models.EmailField('Adresse mail', unique=True)
    first_name = models.CharField('Prénom', max_length=30, blank=True)
    last_name = models.CharField('Nom', max_length=30, blank=True)
    date_joined = models.DateTimeField('date joined', auto_now_add=True)
    company = models.ForeignKey('Company', on_delete=DO_NOTHING, blank=True, null=True)
  • Model Company
class Company(models.Model):
    name = models.CharField(max_length=200, blank=False)
    transporters = models.ManyToManyField(Transporter, blank=True)
  • Model Transporter
class Transporter(models.Model):
    name = models.CharField(max_length=100)
    avatar = models.ImageField(blank=True, null=True)

  • Model Supplement
class Supplement(models.Model):
    transporter = models.ForeignKey(Transporter, on_delete=DO_NOTHING, blank=True, null=True)
    company = models.ForeignKey(Company, on_delete=DO_NOTHING, blank=True, null=True)
    header_row = models.IntegerField(blank=True)

Starting from the user, I would like to access the field header_row in get_context_data(). In my app, the user belongs to a company and the 'supplement' is attached to a Company.

Вот к чему я пришел в views.py :

class UserSupplementView(TemplateView):

    model = User
    template_name = 'tool/try.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user = self.request.user
        context['supplements'] = user.company.supplement.header_row
        print(context['supplements'])
        return context

Но он не работает, и у меня следующее сообщение об ошибке:

'Company' object has no attribute 'supplement'

But if I go with context['supplements'] = user.company.supplement_set.all() , I can actually retrieve part of the data. Could you please help me to retrieve the header_row field?

<<<Поскольку вы используете

, вам необходимо выполнить цикл по набору Queryset. Если вам нужно получить поле .all(), то сначала нужно выполнить цикл по результатам. Вы можете сделать это в представлении или в шаблоне.header_row

В шаблоне:

{% for supplement in supplements %}
 {{ supplement.header_row }}
{% endfor %}

Это должно работать в шаблоне.

Если вы хотите проверить, получаете ли вы все данные, включая header_row без необходимости зацикливания, используйте .first() вместо .all() в представлении или .first в шаблоне {% for supplement in supplements.first %}

Это основано на том, что вы обновили запрос в представлении до того, что вы упомянули в последний раз user.company.supplement_set.all()

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