【问题标题】:How to access model.field in template? django如何访问模板中的model.field? django
【发布时间】:2020-05-18 04:05:06
【问题描述】:

几天前我开始学习 django 并尝试建立我的第一个博客。

我的问题是我决定为我的类别(副标题)添加一个额外的字段,我想在我的模板中添加一个字段,但不知道该怎么做。

我的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.namecategory.subheading 在模板中(由教师)显示的唯一方式是在 {% for post in posts %} {% endfor % }:

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

在这种情况下,如果类别页面上有 10 个帖子,则副标题会重复 10 次。我只需要打印 1 来描述类别。

有没有办法在 {% for post in posts %} 之外调用 category.subheading ?或者以某种方式只打印一个结果。

附言对不起我的初级英语水平。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用Prefetch object [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)
                to_attr='relevant_categories'
            )
        ).order_by(
            'title'
        )
        # …

    在您的模板中,您可以使用:

    
        {% for post in posts %}
            {% for category in post.relevant_categories %}  
                {{ category.subheading }} 
            {% endfor %}
        {% endfor %}
    

    【讨论】:

    • 您好,感谢您的回答!在这种情况下,问题是子标题重复的次数与类别页面上的帖子一样多,例如,如果页面上有 10 个帖子,我会得到 10 个重复的子标题。我想在类别名称下只显示一次副标题。有没有办法限制结果的数量? p.s.相关类别和预取的东西真的很有用!
    【解决方案2】:

    不确定您想要做什么,但您可以通过执行以下操作来搜索和访问 Category 元素:

    categories=Category.objects.filter(name='NameYouWanttoSearch').values_list('subheading')
    

    【讨论】:

    • 我只想在页面上显示类别名称和副标题,我可以使用 {{ category |名称模板中的标题}},但无法显示该类别的副标题。如果我在最后一个引用中使用代码,它会重复副标题的次数与类别页面上的帖子一样多。
    【解决方案3】:

    可以将模型管理器添加到类别中,获取单个实例并在模板中调用它而不是全部。

    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 %}
    

    【讨论】:

      猜你喜欢
      • 2019-05-24
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2013-06-01
      • 2017-03-09
      相关资源
      最近更新 更多