zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python-Django-URL 路由(二)

2023-06-13 09:18:48 时间

Django URL路由的示例

下面是一个简单的Django应用程序的示例,它使用URL路由来处理客户端请求。这个示例应用程序提供了一个简单的博客系统,允许用户浏览博客文章、创建新文章和编辑现有文章。

首先,我们定义一个名为“blog”的Django应用程序,并在其中创建一个名为urls.py的文件:

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的文件中::

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模板。