Python 我想要一个单独显示类别下帖子列表的视图
我正在使用Django开发一个简单的新闻网站。我的问题是,当用户单击某个类别(例如体育)时,我希望能够在一个视图中列出某个类别下的帖子。。。我在我的模型中创建了两个类,它们是:Python 我想要一个单独显示类别下帖子列表的视图,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我正在使用Django开发一个简单的新闻网站。我的问题是,当用户单击某个类别(例如体育)时,我希望能够在一个视图中列出某个类别下的帖子。。。我在我的模型中创建了两个类,它们是: class Category(models.Model): POLITICS = 'Politics' SPORTS = 'Sports' ENTERTAINMENT = 'Entertainment' TECHNOLOGY = 'Technology' CHOICE_CATEGORY_TYPE = (
class Category(models.Model):
POLITICS = 'Politics'
SPORTS = 'Sports'
ENTERTAINMENT = 'Entertainment'
TECHNOLOGY = 'Technology'
CHOICE_CATEGORY_TYPE = (
(POLITICS, 'Politics'),
(SPORTS, 'Sports'),
(ENTERTAINMENT, 'Entertainment'),
(TECHNOLOGY, 'Technology'),
)
category_type = models.CharField(max_length=50, choices=CHOICE_CATEGORY_TYPE, default=None)
def __str__(self):
return self.category_type
class Post(models.Model):
category_type = models.ForeignKey(Category, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
pub_date = models.DateField()
photo = models.ImageField()
body = models.TextField()
def __str__(self):
return self.title
第二,我的看法如下:
def index(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', {'posts': posts})
def detail(request, pk):
article = get_object_or_404(Post, pk=pk)
return render(request, 'blog/detail.html', {'article': article})
def categories(request, category_type=None):
category_post = get_object_or_404(Category, category_type=category_type)
post_list = Post.objects.all()
return render(request, 'blog/category.html', {'category_post':
category_post, 'post_list': post_list})
最后,我的网址:
from django.conf.urls import url
from . import views
app_name = 'blog'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.detail, name='detail'),
url(r'^categories/(?P<category_type>[0-9]+)/$', views.categories,
name='categories'),
]
从django.conf.url导入url
从…起导入视图
应用程序名称='博客'
URL模式=[
url(r'^$',views.index,name='index'),
url(r'^(?P[0-9]+)/$',views.detail,name='detail'),
url(r'^categories/(?P[0-9]+)/$),views.categories,
name='categories'),
]
最后,当我尝试在类别名称中创建一个超链接以引导我到该类别页面,从而从我的索引页面获取该类别页面下的帖子列表时,我遇到了一个错误
Reverse for 'categories' with arguments '(<Category: Sports>,)' not found. 1
pattern(s) tried: ['blog/categories/(?P<category_type>[0-9]+)/$']
Request Method: GET
Request URL: http://127.0.0.1:8000/blog/
Django Version: 1.11.5
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'categories' with arguments '(<Category: Sports>,)' not found. 1
pattern(s) tried: ['blog/categories/(?P<category_type>[0-9]+)/$']
Exception Location: C:\Users\Abdul-Waris\Desktop\website\venv\lib\site-
packages\django\urls\resolvers.py in _reverse_with_prefix, line 497
Python Executable: C:\Users\Abdul-
Waris\Desktop\website\venv\Scripts\python.exe
Python Version: 3.6.2
Python Path:
['C:\\Users\\Abdul-Waris\\Desktop\\website\\mysite',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv\\Scripts\\python36.zip',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv\\DLLs',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv\\lib',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv\\Scripts',
'c:\\users\\abdul-waris\\appdata\\local\\programs\\python\\python36\\Lib',
'c:\\users\\abdul-waris\\appdata\\local\\programs\\python\\python36\\DLLs',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv',
'C:\\Users\\Abdul-Waris\\Desktop\\website\\venv\\lib\\site-packages']
Server time: Fri, 29 Sep 2017 22:23:48 +0000
未找到参数为“(,)”的“类别”的反转。1.
尝试的模式:[“blog/categories/(?P[0-9]+)/$”]
请求方法:获取
请求URL:http://127.0.0.1:8000/blog/
Django版本:1.11.5
异常类型:NoReverseMatch
异常值:
未找到参数为“(,)”的“类别”的反转。1.
尝试的模式:[“blog/categories/(?P[0-9]+)/$”]
异常位置:C:\Users\Abdul Waris\Desktop\website\venv\lib\site-
packages\django\url\resolvers.py在带有前缀的\u reverse\u中,第497行
Python可执行文件:C:\Users\Abdul-
Waris\Desktop\website\venv\Scripts\python.exe
Python版本:3.6.2
Python路径:
['C:\\Users\\Abdul Waris\\Desktop\\website\\mysite',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv\\Scripts\\python36.zip',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv\\DLLs',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv\\lib',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv\\Scripts',
'c:\\users\\abdul waris\\appdata\\local\\programs\\python\\python36\\Lib',
'c:\\users\\abdul waris\\appdata\\local\\programs\\python\\python36\\DLLs',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv',
'C:\\Users\\Abdul Waris\\Desktop\\website\\venv\\lib\\site packages']
服务器时间:2017年9月29日星期五22:23:48+0000
谢谢你你的第一行错误是
Reverse for 'categories' with arguments '(<Category: Sports>,)' not found.
未找到参数为“(,)”的“类别”的反转。
如果查看您的url.py,您可以这样定义类别页面的url:
url(r'^categories/(?P[0-9]+)/$”,views.categories,name='categories')
用于终结点的正则表达式接受1个或多个数字0-9。因此,它将匹配像/categories/3或/categories/2632301这样的URL,而不是像“sports”这样的字母。此外,由于这是用于查看单个类别的URL,我不会将URL命名为“类别”,但可能类似于“类别”或“一个类别”:
url(r'^categories/(?p[a-zA-Z0-9]+)/$,views.categories,name='categority')
现在,您的URL将与/categories/sports、/categories/entertainment和/categories/SpoRts123等URL正确匹配
另外,在blog/detail.html模板中,您可以动态创建一个指向文章类别的URL,如下所示:
{%url'category'category\u type=article.category\u type%}
我的最后一个建议是将外键改为a类ManyToManyField;想想看,你可以有一个类别和许多帖子,一篇帖子可以有许多类别。这取决于您的上下文,完全取决于您,但我建议您使用多对多,因为以后您可能会决定将多个类别附加到一篇文章/文章。您能告诉我们“尝试在类别名称中创建超链接”的位置或方式吗?请将您的URL更改为URL(r'^categories/(?p[\w-]+)/$',views.categories,name='categories'),{%extends'blog/base.html'>{%block content%}
{%for post%}
{{post.body | truncatewords:20}
{{post.pub_date} {ul ul>{%endfor%}