我想创建一个博客页面,它可以完美地工作,但我想改变特定的博客文章的网址。当前特定博客文章的URL为myurl.com/blog/pk,但我希望它是myurl.com/blog/category/title相反。我该怎么做?如果你喜欢的话,也可以对代码进行任何形式的批评。你知道吗
型号.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=20)
class Post(models.Model):
title = models.SlugField(max_length = 250, null = True, blank = True)
body = models.TextField()
created_on = models.DateTimeField(null=True)
last_modified = models.DateTimeField(null=True)
categories = models.ManyToManyField('Category', related_name='posts')
class Comment(models.Model):
author = models.CharField(max_length=60)
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
post = models.ForeignKey('Post', on_delete=models.CASCADE)
视图.py
from django.shortcuts import render
from .models import Post
from .models import Comment
from .forms import CommentForm
from django.http import HttpResponse
def blog_index(request):
posts = Post.objects.all().order_by('-created_on')
context = {
"posts": posts,
}
return render(request, "blog_index.html", context)
def blog_category(request, category):
posts = Post.objects.filter(
categories__name__contains=category
).order_by(
'-created_on'
)
if not posts:
return HttpResponse(status=404)
context = {
"category": category,
"posts": posts
}
return render(request, "blog_category.html", context)
def blog_detail(request, pk):
post = Post.objects.get(pk=pk)
form = CommentForm()
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = Comment(
author=form.cleaned_data["author"],
body=form.cleaned_data["body"],
post=post
)
comment.save()
comments = Comment.objects.filter(post=post)
context = {
"post": post,
"comments": comments,
"form": form,
}
return render(request, "blog_detail.html", context)
应用程序网址.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.blog_index, name="blog_index"),
path("<int:pk>/", views.blog_detail, name="blog_detail"),
path("<category>/", views.blog_category, name="blog_category"),
]
项目URL
path('blog/', include('blog.urls')),
我确信你不想用头衔。标题通常可以包含空格(
), punctuations (
~!#.?
等)和特殊字符。URL不能包含这些字符中的大多数。我们确实可以避开这些字符,但是URL看起来很难看,比如:现在,这不是很可读。你知道吗
但是,您可以使用带有^{} [Django-doc]的slug。一个
SlugField
是一个CharField
,但是它做了一些清理以避免丑陋的url。例如'some title containing spaces'
将转换为some-title-containing-spaces
。你知道吗您可以将
SlugField
添加到CategoryModel
中,如下所示:在
urlpatterns
中,我们可以将slug
指定为:然后,我们可以在我们的视野中过滤鼻涕虫:
产生独特的弹头
有时可能会发生另一个
Category
对象的slug
已经存在的情况,我们可以使用脚本生成唯一的slug,例如:相关问题 更多 >
编程相关推荐