在 Django 中过滤 Queryset 并设计正确的 urls.py 和模板
Posted
技术标签:
【中文标题】在 Django 中过滤 Queryset 并设计正确的 urls.py 和模板【英文标题】:Filtering Queryset and designing correct urls.py and templates in Django 【发布时间】:2017-12-21 02:43:15 【问题描述】:我正在设计一个视频渲染儿童网站。
该应用具有父 类别,例如:卡通、教育节目等。每个 类别 有多个 帖子,例如 Jungle_book、Duck_tales 等卡通。 每个帖子都有多个剧集。 我正在为视图使用通用视图(列表视图、详细视图)。这是我的 Models.py
from django.db import models
from personal.models import Post
class cartoons_post(models.Model):
category= models.ForeignKey(Post, on_delete=models.CASCADE)
title = models.CharField(max_length = 140)
thumbnail=models.ImageField()
date=models.DateField()
def __unicode__(self):
return self.title
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:detail", kwargs="id": self.id)
class post_episode(models.Model):
post_id= models.ForeignKey(cartoons_post, on_delete=models.CASCADE)
title = models.CharField(max_length = 140)
thumbnail=models.ImageField()
date=models.DateField()
video=models.FileField()
def __unicode__(self):
return self.title
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("posts:detail", kwargs="id": self.id)
这是我的 urls.py
from django.conf.urls import url, include
from django.views.generic import ListView, DetailView
from cartoons.models import cartoons_post,post_episode
from django.contrib.auth.decorators import login_required
urlpatterns = [
url(r'^$', login_required(ListView.as_view(
queryset=cartoons_post.objects.all().order_by("-date")[:10],
template_name="cartoons/cartoons.html"))),
url(r'^(?P<pk>\d+)$', login_required(ListView.as_view(
queryset=post_episode.objects.filter(post_id=1).order_by("-date"),
template_name="cartoons/post.html"))),
url(r'^(?P<pk>\d+\d+)$',login_required(DetailView.as_view(
model = post_episode,
template_name="cartoons/post_episode.html"))),
]
这是我的三个模板
cartoons.html
% extends "personal/header.html" %
% load staticfiles %
% block content %
% for cartoons_post in object_list %
<a href="/cartoons/cartoons_post.id"> <img src= "cartoons_post.thumbnail.url" > </a>
% endfor %
% endblock %
post.html
% extends "personal/header.html" %
% load staticfiles %
% block content %
% for post_episode in object_list %
<a href="/cartoons/post_episode.id"> <img src= "post_episode.thumbnail.url" > </a>
% endfor %
% endblock %
post_episode.html
% extends "personal/header.html" %
% load staticfiles %
% block content %
<div class="container-fluid_cartoons">
<h3>post_episode.title</h3>
<video controls>
<source src="post_episdoe.video.url" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
% endblock %
问题 - 只有 cartoons.html 可以正常工作。
点击单个帖子后,相关 post.html 会显示上传的所有剧集,而不是仅与单个帖子相关的剧集。
点击一集后,什么也没有发生。
【问题讨论】:
你应该使用 @python_2_unicode_compitable 而不是自定义 unicode 和 str 【参考方案1】:您应该考虑创建views.py
文件,而不是在 urls.py 中使用通用视图。我认为问题在于以下行
url(r'^(?P<pk>\d+)$',login_required(ListView.as_view(queryset=post_episode.objects.filter(post_id=1).order_by("-date"),template_name="cartoons/post.html"))),
在这里,如果我的猜测是正确的,您正在尝试将帖子模型的 id
从 url 传递到视图。但是要让 ListView 接受 url kwargs (post_id),您必须在 views.py 中编写另一个视图。也许像下面这样。
class EpisodeListView(ListView):
template_name = 'cartoons/post.html'
def get_queryset(self):
return post_episode.objects.filter(post_id=self.kwargs['post_id']).order_by("-date")
然后将 url 路由到该视图:
from <yourapp.views> import EpisodeListView
from django.contrib.auth.decorators import login_required
url(r'^episodes/(?P<pk>\d+)$',login_required(EpisodeListView.as_view())
【讨论】:
以上是关于在 Django 中过滤 Queryset 并设计正确的 urls.py 和模板的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中,如何使用动态字段查找过滤 QuerySet?