Мне нужно получить доступ к значению в обратном порядке, используя ForeignKey. Я хочу перейти от дочерней модели Category к родительской модели Post и захватить значение title в моем шаблоне

Я пытался category.posts.title, но у меня ничего не получилось.

Основная цель этого - создать <div> для каждой категории и перечислить сообщения блога с этой категорией внизу.

Модели :

class Category(models.Model):
    name = models.CharField(max_length=30)

class Post(models.Model):
    slug = models.SlugField(max_length = 250, null = True, blank = True)
    title = models.CharField(max_length = 250, default="Blog Post")
    body = models.TextField()
    created_on = models.DateTimeField(null=True)
    last_modified = models.DateTimeField(null=True)
    categories = models.ForeignKey('Category', related_name='posts', default="2", unique=False, on_delete=models.CASCADE)

Посмотреть:

def blog_index(request):
    posts = Post.objects.all().order_by('-created_on')
    categories = Category.objects.all()
    context = {
        "posts": posts,
        "categories": categories,
    }
    return render(request, "blog_index.html", context)

Шаблон

<div class="row">
<div style="padding: 0px;" class="col l12">
    {% for category in categories %}

<div class="col l3">
    <div style="background-color: white; box-shadow: 0 1px 15px 1px rgba(62,57,107,.07); border-radius: .6rem;" class="card ">
        <div class="card-body text-center">
            <div class="mb-4 pb-3"><i class="ti-briefcase text-muted font-40"></i></div>

            <h5 class="mb-3"> <a href="{% url 'blog_category' category %}">{{ category.name }}</a></h5>

            <div><a class="d-inline-flex align-items-center text-danger" ><a href="{% url 'blog_detail' category.name category.posts.slug category.posts.pk %}">{{ category.posts.title }}</a><i class="material-icons">
                keyboard_arrow_right
                </i></a></div>

        </div>
    </div>
</div>
{% endfor %}
0
Lesnie Sncheider 27 Май 2019 в 22:24

2 ответа

Лучший ответ

Вам нужно перебрать сообщения в каждой категории

{% for post in category.posts.all %}
    <a href="{% url 'blog_detail' category.name post.slug post.pk %}">{{ post.title }}</a>
{% endfor %}

Вам также следует использовать prefetch_related в наборе запросов своих категорий уменьшить количество запросов к БД, которые вы делаете при доступе к category.posts.all, так как вам больше не нужен набор запросов к вашим сообщениям

def blog_index(request):
    categories = Category.objects.annotate(
        post_count=Count('posts')
    ).prefetch_related('posts')
    context = {
        "categories": categories,
    }
    return render(request, "blog_index.html", context)

Добавлена аннотация для получения количества сообщений для каждого категория

{% category.post_count %}
1
Iain Shelvington 27 Май 2019 в 20:41

Поскольку один Category может иметь несколько сообщений, вам нужно будет их перебрать:

category.posts.all()

В шаблоне:

{% for category in categories %}
    {{ category.name }}
    { % for post in category.posts.all %}
        {{ post.title }}
    {% endfor %}
{% endfor%}
2
Sergey Pugach 27 Май 2019 в 19:47