Как получить доступ к model.field в шаблоне? django - PullRequest
2 голосов
/ 02 февраля 2020

Я начал изучать django несколько дней go и пытался создать свой первый блог.

Моя проблема в том, что я решил добавить дополнительное поле для своих категорий (подзаголовок), которое я хочу быть в моем шаблоне, но не могу понять, как это сделать.

my models.py

from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=20)
    subheading = models.CharField(max_length=160)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    link = models.TextField()
    categories = models.ManyToManyField("Category", related_name="posts")

    def __str__(self):
        return self.title

views.py

from django.shortcuts import render
from blog.models import Post, Category

def blog_category(request, category):
    posts = Post.objects.filter(
        categories__name__contains=category
    ).order_by(
        'title'
    )
    context = {
        "category": category,
        "posts": posts
    }
    return render(request, "blog_category.html", context)

Единственный способ category.name или category.subheading отображаются в шаблоне (учителем) внутри {% для сообщений в сообщениях%} {% endfor%}:

{% for post in posts %}
{% for category in post.categories.all %}
{{ category.subheading }} 
{% endfor %}
{% endfor %}

В этом случае, если на странице категории 10 сообщений, подзаголовок повторяется 10 раз. Мне нужно только напечатать 1 для описания категории.

Есть ли способ позвонить category.subheading за пределами {% для сообщения в сообщениях%}? Или как-то распечатать только один результат.

ps извините за мой примитивный уровень Engli sh.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

Вы можете сделать это с Prefetch объектом [Django -doc] :

from django.db.models import Prefetch

def blog_category(request, category):
    posts = Post.objects.filter(
        categories__name__contains=category
    ).prefetch_related(
        Prefetch(
            'categories',
            Category.objects.filter(name__contains=category)
            <b>to_attr='relevant_categories'</b>
        )
    ).order_by(
        'title'
    )
    # &hellip;

В вашем шаблоне вы можете затем сделать это с:


    {% for post in posts %}
        {% for category in post.<b>relevant_categories</b> %}  
            {{ category.subheading }} 
        {% endfor %}
    {% endfor %}
0 голосов
/ 02 февраля 2020

может добавить менеджер моделей в категории, взять один экземпляр и вызвать его в шаблонах вместо всех.

class CategoryManager(models.Manager):

    def single_category(self):
        return self.get_queryset()[:1]

class Category(models.Model):
    name = models.CharField(max_length=20)
    subheading = models.CharField(max_length=160)
    objects = CategoryManager()

    def __str__(self):
        return self.name

и в шаблонах

{% for post in posts %}
{% for category in post.categories.single_category %}
{{ category.subheading }} 
{% endfor %}
{% endfor %}
0 голосов
/ 02 февраля 2020

Не обязательно понимать, что вы хотите сделать, но вы можете искать и получать доступ к элементам категории, выполнив что-то вроде этого:

categories=Category.objects.filter(name='NameYouWanttoSearch').values_list('subheading')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...