详解Django的 reverse() 函数:根据视图名称反向生成 URL

  • Post category:Python

Django 的 reverse() 函数用于通过 URL 名称反向解析出 URL。

作用:
– 在函数视图、类视图、模板中生成 URL;
– 跳转页面时传递参数。

使用方法:

  1. 导入 reverse 函数:
from django.urls import reverse
  1. 使用 reverse() 函数来生成 URL:
url = reverse('视图函数的名称')

或者

url = reverse('命名空间:视图函数的名称')

其中,视图函数的名称命名空间 是在定义 URL 时给出的。

  1. 生成 URL 后可以直接使用:
return redirect(url)

实例 1:在函数视图中使用 reverse 生成 URL:

from django.shortcuts import render, redirect
from django.urls import reverse
from .models import Post

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    # 生成编辑页面的 URL
    edit_url = reverse('blog:edit_post', args=[pk])
    return render(request, 'blog/post_detail.html', {'post': post, 'edit_url': edit_url})

def post_edit(request, pk):
    if request.method == 'POST':
        # 处理表单提交
        return redirect('blog:post_detail', pk=pk)
    post = Post.objects.get(pk=pk)
    return render(request, 'blog/post_edit.html', {'post': post})

post_detail 中,我们根据 Post 对象的主键 pk 生成一个名为 edit_post 的 URL。然后将这个 URL 传递给模板页面,在模板中可以通过 edit_url 变量来调用这个 URL。

post_edit 中,我们根据 Post 对象的主键 pk 生成名为 post_detail 的 URL。当表单提交成功后,我们通过 redirect 函数跳转到该 URL。

实例 2:在模板中使用 reverse 生成 URL:

{% extends 'base.html' %}

{% block content %}
  <h1>{{ post.title }}</h1>
  <p>{{ post.content }}</p>
  <p><a href="{% url 'blog:edit_post' post.pk %}">编辑</a></p>
{% endblock %}

在模板中,我们使用 {% url %} 模板标签来生成 URL,这个标签与 reverse 函数的作用类似。我们可以指定视图函数的名称和参数,生成对应的 URL。这里生成了 edit_post 视图的 URL,参数 post.pk 指定了被编辑文章的主键值。