[英]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.name或category.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.