我是Django的初学者。我正在构建一个名为PhoneReview的Django应用。它将存储与最新手机有关的评论。它还将显示手机品牌以及相关的手机型号。我设法对应用程序做了一些说明。现在,我对一行代码有些困惑。
我的一个模板文件中有这样的代码:
{% extends 'gamereview/base.html' %}
{% block title%}
Detail
{% endblock %}
{% block content %}
<h3>This is the review for {{game.title}} </h3>
<ul>{% for review_item in game.review_set.all %}
<li>{{ review_item.review }}</li>
{% endfor %}
</ul>
{% endblock %}
我不明白这部分内容:
<ul>{% for review_item in game.review_set.all %}
这行是什么意思?
以下是 models.py 中的代码:
from django.db import models
from django.template.defaultfilters import slugify
# Create your models here.
class Tag(models.Model):
label = models.CharField(max_length=20)
def __str__(self):
return self.label
class Game(models.Model):
title = models.CharField(max_length=100)
developer = models.CharField(max_length=100)
platform = models.CharField(max_length=50, default='null')
label_tag = models.ManyToManyField(Tag)
slug = models.SlugField(max_length=150, default='null')
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
class Review(models.Model):
game = models.ForeignKey(Game, on_delete=models.CASCADE)
review = models.CharField(max_length=1000)
date = models.DateField(auto_now=True)
slug = models.SlugField(max_length=150, default='null')
def __str__(self):
return self.review
def save(self):
super(Review, self).save()
self.slug = '%i-%s' % (
self.id, slugify(self.game.title)
)
super(Review, self).save()
以下是 views.py 中的代码:
from django.views import generic
from .models import Game
class GameListView(generic.ListView):
template_name = 'gamereview/gamelist.html'
context_object_name = 'all_games'
def get_queryset(self):
return Game.objects.all()
class ReviewView(generic.DetailView):
model = Game
template_name = 'gamereview/review.html'
以下是 urls.py 中的代码:
from . import views
from django.urls import path
app_name = 'gamereview'
urlpatterns = [
path('gamereview/', views.GameListView.as_view(), name='gamelist'),
path('gamereview/<slug:slug>/', views.ReviewView.as_view(), name='review'),
]
我对这一行感到有些困惑:<ul>{% for review_item in game.review_set.all %}
。您能帮我澄清一下吗?
答案 0 :(得分:2)
看看models
;有一个Game
类。显然,您在模板中以game
的名称收到了该类的实例。
Game
类将Review
类引用为外键。由于Django ORM的工作方式,这为Game
类提供了反向链接.review_set
;它包含所有引用特定游戏的评论对象。因此game.review_set
。
该.review_set
属性不是列表,而是数据库结果集。您可以对其进行过滤,排序等,但就您而言,您只是从中获取所有记录。因此game.review_set.all
。
请花一些时间阅读有关Django工作原理的介绍,其中有许多内容不能仅凭常识就可以得出。