gpt4 book ai didi

python - 我应该如何更改 "urlpatterns"中的路径?

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:11 25 4
gpt4 key购买 nike

我正在尝试创建一个博客,并希望文章按类别划分。 Django 版本:2.1,Python:3.7我不明白我应该如何更改 urlpatterns 中的路径以显示类别名称,而不是 <int:pk> .在哪里可以查看 Django 代码示例?

我尝试执行 path('category.title') 但它不起作用。

这是我的模型.py:

from django.db import models
from django.conf import settings
from django.urls import reverse

class Category(models.Model):
title = models.CharField(max_length=50)
image = models.ImageField(upload_to='', blank=True)

def __str__(self):
return self.title

class Article(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
image = models.ImageField(upload_to='', blank=True)
cat = models.ForeignKey(
Category, on_delete=models.CASCADE, null=True,
)

def __str__(self):
return self.title

def get_absolute_url(self):
return reverse('article_detail', args=[str(self.id)])

class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
comment = models.CharField(max_length=100)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)

def __str__(self):
return self.comment

def get_absolute_url(self):

return reverse('article_list')

这是 urls.py:

from django.urls import path
from . import views
from .models import Category

urlpatterns = [
path('', views.ArticleViewList.as_view(), name='article_list'),
path('<int:pk>/edit/', views.ArticleUpdateView.as_view(), name='article_edit'),
path('<int:pk>/delete/', views.ArticleDeleteView.as_view(), name='article_delete'),
path('<int:pk>', views.ArticleDetailView.as_view(), name='article_detail'),
path('new/', views.ArticleCreateView.as_view(), name='article_new'),
]

这是返回文章列表的基于类的 View :

 class ArticleViewList(LoginRequiredMixin, ListView):
model = models.Article
template_name = 'article_list.html'
login_url = 'login'

1)我希望在地址栏中显示类别的标题2)我想知道使用基于类的 View 是不是一个好的决定3)我想知道如何在模板循环中显示特定类别的文章

最佳答案

希望您的网址看起来像:
/ - 所有帖子的列表,无论类别如何
/category1 - 类别 1 中所有帖子的列表
/category1/1 - post #1 的详细信息(可选,必须或不得不属于 category1)

你需要做几件事:
1) 您需要将 SlugField 添加到您的类别模型 - 这是 url 中的实际字符串,因为对 url 中的内容有一些限制。

模型.py:

class Category(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(unique=True)
image = models.ImageField(upload_to='', blank=True)

def __str__(self):
return self.title

2) 修改urlpatterns以要求slug

urls.py:

urlpatterns = [
path('', ArticleViewList.as_view(), name='article_list'),
path('<slug:catslug>', ArticleViewList.as_view(), name='article_list'),
path('<slug:catslug>/<int:pk>', ArticleDetailView.as_view(), name='article_detail'),
]

3) 为您的 ArticleViewList 添加查询集过滤器,这样您就可以仅根据 slug 字段值包含来自特定类别的文章。

views.py:

from django.shortcuts import get_object_or_404

class ArticleViewList(LoginRequiredMixin, ListView):
model = Article
template_name = 'article_list.html'
login_url = 'login'

def get_queryset(self):
queryset = super().get_queryset()
if 'catslug' in self.kwargs:
category_slug = self.kwargs['catslug']
category = get_object_or_404(Category, slug=category_slug)
queryset = queryset.filter(cat=category)
return queryset

4) (可选)通过修改查询集强制检查您的文章详细信息 View 是否属于某个类别。

views.py:

class ArticleDetailView(LoginRequiredMixin, DetailView):
model = Article
template_name = 'article_item.html'
login_url = 'login'

def get_queryset(self):
queryset = super().get_queryset()
category_slug = self.kwargs['catslug']
category = get_object_or_404(Category, slug=category_slug)
queryset = queryset.filter(cat=category)
return queryset

使用 CBV 是一个明智的决定 - 因为您的所有 View 都很简单,并且正是 CBV 的设计目的。它将允许您拥有小巧且可读的代码。

您可以使用 {% regroup %}按类别对文章进行分组:

文章列表.html:

{% regroup object_list by cat as categories %}

{% for category in categories %}
{{ category.grouper }}:</br>
{% for object in category.list %}
{{ object }}<br>
{% endfor %}
{% endfor %}

关于python - 我应该如何更改 "urlpatterns"中的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com