Показать список связанных объектов в шаблоне Django

#python #django

#питон #джанго

Вопрос:

У меня проблема с отображением списка связанных статей в моем представлении вопросов и ответов. У меня есть поле, в котором пользователь может подключить статью к вопросам и ответам с сайта администратора. Что я хочу, так это отобразить эти связанные статьи.

models.py

 class QA(models.Model):  id = models.AutoField(primary_key=True)  author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL) #settings INSTALLED_APPS  title = models.CharField(max_length=750)  category = models.ForeignKey(Category, on_delete = models.CASCADE, blank=True)  related_articles = models.ManyToManyField(Article, default=None, blank=True, related_name='related_article')   slug = models.SlugField(unique=True, blank=True)  class Article(models.Model):  id = models.AutoField(primary_key=True)  author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL) #settings INSTALLED_APPS  title = models.CharField(max_length=200)  category = models.ForeignKey(Category, on_delete = models.CASCADE, blank=True)  slug = models.SlugField(unique=True, blank=True)  

views.py

 class QADetailView(LoginRequiredMixin, DetailView):  login_url = 'login'  redirect_field_name = 'login'  template_name = 'QADetailView.html'  model = QA   def get_context_data(self, **kwargs):  categories = Category.objects.all()   related_articles = Article.objects.filter(related_article=self.kwargs['id']) #No idea what to put in filter  #related_articles = Article.objects.filter(related_article='1')    context['related_article'] = related_articles  context['categories'] = categories    return context  

QADetailView.html

 {% for article in related_article %}  {{article.title}} {% endfor %}  

Ответ №1:

Вам не нужно вставлять соответствующие статьи в контекст шаблона, вы можете просто написать в своем QADetailView.html шаблоне (без какого-либо необходимого редактирования).:

 {% for article in object.related_articles.all %}  {{article.title}} {% endfor %}  

Ответ №2:

Сначала проверьте решение RedWheelBorrow. Если это не сработает. Попробуйте сделать следующее:

Возможно, есть лучший способ структурировать ваши занятия. Таким образом, в Django можно смоделировать иерархию. Например, при создании представления счета-фактуры это будет выглядеть примерно так.

 from django.db import models   class Invoice(models.Model):  """Representing a invoice"""  user = models.ForeignKey(to=User, on_delete=models.PROTECT, related_name="invoices", default=1)  title = models.CharField(max_length=200)  date = models.DateField()  start_time = models.TimeField(default=time(9))  duration = models.IntegerField(default=1)  invoice_number = models.CharField(max_length=500, default=increment_invoice_number) # increment_invoice_number this a function that I will leave out of this answer   class InvoiceLine(models.Model):  """Representing invoice lines of an invoice"""  invoice = models.ForeignKey(to=Invoice, on_delete=models.CASCADE, related_name="lines")  description = models.CharField(_("Beschrijving"), max_length=512)  quantity = models.IntegerField(_("Aantal"), blank=True, default=1)  discount = models.IntegerField(_("Korting in %"), default=0)     

Пожалуйста, обратите внимание, что представленному здесь представлению счета-фактуры не хватает некоторых атрибутов, чтобы быть полностью функциональным классом в производстве. Ему все еще нужны налоговые справки и т. Д. Однако в нем содержится решение вашей проблемы.

Класс счетов-фактур имеет пользователя атрибута, который содержит внешний ключ с именем «счета-фактуры», связанным с ним. Это означает, что объект должен быть связан с объектом пользователя. У пользователя может быть несколько счетов-фактур. Счет — фактура может быть привязана только к одному Пользователю. Это отношение «один ко многим»:

Пользователь -gt; Список[Счет,…]

При взгляде на строку счетов класса мы видим аналогичную картину. Счет-фактура атрибута является внешним ключом со ссылкой на класс счета-фактуры и содержит «строки» в качестве связанного имени. Это также отношение «один ко многим».

Счет -фактура — gt; Список[Строка счета-фактуры, …]

Для получения связанных объектов мы можем использовать следующий код:

 # obtain user user = User.objects.get(id=lt;USER_IDgt;)  # obtain all Invoice objects linked to user invoices = user.invoices.all()  # print all string representations of Invoice objects print(invoices)  # obtain all InvoiceLine objects linked to invoices for invoice in invoices:  lines = invoice.lines.all()  print(lines)   

В приведенном выше примере наивысшим объектом является Пользователь. Пользователь может хранить несколько объектов накладной. Объект счета-фактуры может содержать несколько объектов строки счета-фактуры. Мы можем использовать ту же стратегию для решения вашей проблемы.

Мы хотим получить следующее представление:

User -gt; List[QA, …] QA -gt; List[Article, …]

   class QA(models.Model):  id = models.AutoField(primary_key=True)   # So in your case the author is the user.   # Here you define User -gt; List[QA, ...]   author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL) #settings INSTALLED_APPS   title = models.CharField(max_length=750)  category = models.ForeignKey(Category, on_delete = models.CASCADE, blank=True)  slug = models.SlugField(unique=True, blank=True)   # related_articles is removed.   class Article(models.Model):  id = models.AutoField(primary_key=True)  author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL) #settings INSTALLED_APPS  title = models.CharField(max_length=200)  category = models.ForeignKey(Category, on_delete = models.CASCADE, blank=True)  slug = models.SlugField(unique=True, blank=True)**  related_articles = models.ForeignKey(to=QA, on_delete=models.CASCADE, related_name="related_articles")   class QADetailView(LoginRequiredMixin, DetailView):  login_url = 'login'  redirect_field_name = 'login'  template_name = 'QADetailView.html'  model = QA   def get_context_data(self, **kwargs):  categories = Category.objects.all()   # obtain specific QA  qa = QA.objects.get(pk=id, author=self.request.user)) # check how you named the id variable in your url.   # obtain related articles  related_articles = qa.related_articles.all()   # Save in context for use in template.  context['related_articles'] = related_articles # Added an character 's' to key value for there is can be more than one related article.  context['categories'] = categories    return context   {% for article in related_articles %} # Also add character 's' here  {{article.title}} {% endfor %}  

This should do the trick. There might be some improvements on error handling though I hope this works. If not, let me know.