Django URL路由的示例
下面是一个简单的Django应用程序的示例,它使用URL路由来处理客户端请求。这个示例应用程序提供了一个简单的博客系统,允许用户浏览博客文章、创建新文章和编辑现有文章。
首先,我们定义一个名为“blog”的Django应用程序,并在其中创建一个名为urls.py的文件:
代码语言:javascript复制from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/create/', views.post_create, name='post_create'),
path('post/<slug:slug>/', views.post_detail, name='post_detail'),
path('post/<slug:slug>/edit/', views.post_edit, name='post_edit'),
]
在这个示例中,我们定义了四个不同的URL模式。第一个URL模式是空字符串,它将请求映射到我们之前定义的post_list视图函数。第二个URL模式是“post/create/”,它将请求映射到我们之前定义的post_create视图函数。第三个URL模式是“post/slug:slug/”,它将请求映射到我们之前定义的post_detail视图函数,并使用一个命名捕获组来表示文章的slug。最后一个URL模式是“post/slug:slug/edit/”,它将请求映射到我们之前定义的post_edit视图函数,并使用一个命名捕获组来表示文章的slug。
接下来,我们定义这些视图函数。在这个示例中,我们将这些视图函数定义在名为views.py的文件中::
代码语言:javascript复制from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic.edit import CreateView, UpdateView
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.utils.text import slugify
from .models import Post
@login_required
def post_create(request):
if request.method == 'POST':
title = request.POST['title']
content = request.POST['content']
slug = slugify(title)
post = Post.objects.create(
author=request.user,
title=title,
content=content,
slug=slug,
)
return redirect('blog:post_detail', slug=slug)
return render(request, 'blog/post_create.html')
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, 'blog/post_detail.html', {'post': post})
@login_required
def post_edit(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
post.title = request.POST['title']
post.content = request.POST['content']
post.slug = slugify(post.title)
post.save()
return redirect('blog:post_detail', slug=post.slug)
return render(request, 'blog/post_edit.html', {'post': post})
class PostList(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'content']
success_url = reverse_lazy('blog:post_list')
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.slug = slugify(form.instance.title)
return super().form_valid(form)
post_list = PostList.as_view()
在这个示例中,我们定义了四个视图函数。第一个视图函数是post_create,它允许用户创建新的博客文章。如果请求方法是POST,视图函数将获取用户提交的文章标题和内容,并创建一个新的Post对象,然后将用户重定向到新创建的文章的详细页面。如果请求方法是GET,视图函数将渲染一个包含创建新文章表单的HTML模板。
第二个视图函数是post_detail,它显示单个博客文章的详细信息。视图函数获取文章的slug,并使用get_object_or_404函数从数据库中获取文章对象。然后,视图函数将文章对象传递给包含文章详细信息的HTML模板。
第三个视图函数是post_edit,它允许用户编辑现有的博客文章。如果请求方法是POST,视图函数将获取用户提交的文章标题和内容,并更新现有的Post对象,然后将用户重定向到更新后的文章的详细页面。如果请求方法是GET,视图函数将渲染一个包含编辑现有文章表单的HTML模板。
最后一个视图函数是PostList,它显示所有博客文章的列表,并允许用户创建新的博客文章。这个视图函数使用Django的通用视图类CreateView来处理创建新文章的表单,然后重定向到post_list视图函数,这个视图函数将渲染一个包含所有文章的列表的HTML模板。