Обратный запрос Django в шаблоне

#django #reverse

#django #обратный

Вопрос:

У меня есть модели, подобные этой

 class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __unicode__(self):
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
  

Я хочу перечислить все блоги на странице. Я написал представление таким образом, что

 def listAllBlogs(request):
    blogs= Blog.objects.all()
    return object_list(
        request,
        blogs,
        template_object_name = "blog",
        allow_empty = True,
        )
  

И я могу отобразить слоган блога таким образом, чтобы в поле зрения

 {% extends "base.html" %}
{% block title %}{% endblock %}
{% block extrahead %}

{% endblock %}

{% block content %}
     {% for blog in blog_list %}
          {{ blog.tagline }}
     {% endfor %}
{% endblock %}
  

Но я хотел бы показать, такую вещь blog__entry__name но я не знаю, как я могу достичь этого в шаблоне.
Кроме того, в блоге может не быть записи. Как я могу определить в шаблоне?

Спасибо

Комментарии:

1. Оба приведенных ниже ответа верны, всего два замечания. Определите поле related_name='entries' для blog , и вы сможете писать blog.entries . И используйте select_related() , чтобы не выполнять N 1 SQL-запросов.

Ответ №1:

Для доступа к записям в блоге (связанный менеджер): blog.entry_set.all

Для выполнения других действий, если в блоге нет записей, у вас есть тег {% empty %}, который выполняется, когда набор пуст.

 {% block content %}
     {% for blog in blog_list %}
          {{ blog.tagline }}
          {% for entry in blog.entry_set.all %}
              {{entry.name}}
          {% empty %}
             <!-- no entries -->
          {% endfor %}
     {% endfor %}
{% endblock %}
  

Комментарии:

1. @brsbilgic related_name

2. Для OneToOneField вы можете просто использовать: blog.entry (вместо blog.entry_set ). docs.djangoproject.com/en/dev/topics/db/queries /…

3. Это отлично работает. Спасибо! Но что, если бы отношения были взаимно однозначными blog = models. OneToOneField(Блог, уникальный = True) . Как правильно сделать такую вещь в шаблоне, как `{{ blog.entry__headline }}`

Ответ №2:

на основе вашего кода вы могли бы сделать следующее.

 {% block content %}
     {% for blog in blog_list %}
          {{ blog.tagline }}
          {% for entry in blog.entry_set.all %}
              {{entry.name}}
          {% endfor %}
     {% endfor %}
{% endblock %}
  

Комментарии:

1. Разве это не должно быть blog.entry_set, а не blog_entry_set?