Доступ к полю из модели, связанной с другой моделью, с помощью функции 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()