簡體   English   中英

如何訪問模板中的model.field? 姜戈

[英]How to access model.field in template? django

幾天前我開始學習 django 並嘗試建立我的第一個博客。

我的問題是我決定為我的類別(副標題)添加一個額外的字段,我想在我的模板中添加一個字段,但不知道如何去做。

我的模型.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

視圖.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 或者以某種方式只打印一個結果。

ps 對不起我原始的英語水平。

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

在您的模板中,您可以使用以下命令進行渲染:


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

不確定您想做什么,但您可以通過執行以下操作來搜索和訪問 Category 元素:

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

可以將模型管理器添加到類別中,采用單個實例並在模板中調用它而不是全部。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM