Python 我想要一个单独显示类别下帖子列表的视图

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 = (

我正在使用Django开发一个简单的新闻网站。我的问题是,当用户单击某个类别(例如体育)时,我希望能够在一个视图中列出某个类别下的帖子。。。我在我的模型中创建了两个类,它们是:

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