#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?