Django URL重定向的HttpResponseDirect, redirect和reverse方法

HttpResponseDirect方法

  • HttpResponseRedirect是django首选的URL重定向方法,在django.http模块里。该方法的第一个参数是必要的,是用来重定向的URL地址。这个URL可以是完整的链接(比如’http://www.baidu.com‘),也可以是一个不包含域名的静态链接(例如‘/index/’)
  • HttpReponseDirect只支持hard coded urls(硬编码链接), 不能直接使用命名的URL,如使用HttpResponseDirect('blog:article_list‘)是错误的。在使用URL命名时,我们需要先通过URL反向解析方法reverse先对命名URL(article_list)进行解析,然后再使用HttpReponseRedirect定向(如下面的代码)。
  • 对于包含参数的URL(/article/2/new-day/),使用HttpResponseDirect定向前一般需要先使用reverse方法对命名的URL(如’article_detail’)进行解析,同时传递参数(如id, slug等)。
from .models import Article
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from .forms import ArticleForm

def article_create(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            article = form.save()
            return HttpResponseRedirect(reverse('blog:article_detail', args=[str(article.pk), article.slug]))
    else:
        form = ArticleForm()
    return render(request, 'blog/article_create_form.html', {'form': form})

redirect方法

  • redirect是URL重新定向的便捷方法,在django.shortcuts模块里。HttpResponseRedirect能支持的URL重定向,redirect都支持。比如下面3种重定向是redirect的常规用法。
from django.shortcuts import redirect
from django.urls import reverse
def my_view(request):
    ...
    return redirect('/index/')   
def my_view(request):
    ...
    return redirect('https://www.baidu.com/')
def my_view(request):
    ...
    return redirect(reverse('blog:article_list'))
  • 除此之外,redirect还可以根据对象Object重定向和根据视图view重定向,根据视图重定向的时候还可以传递额外的参数。
  1. 根据对象Object重定向,使用该方法的前提是模型里已经定义了get_asbolute_url方法,使用redirect会自动调用get_absolute_url方法。
from django.shortcuts import redirect
def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj)
  1. 根据视图view重定向,使用该方法的前提已对URL进行了命名,且对应了相应的视图。下面案例中redirect会先根据视图函数的名字查找对应url,在传递额外参数。后台工作还是由reverse方法来完成的。
def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

reverse方法

  • reverse方法的作用是对已命名的URL进行反向解析,还传递相应的参数(args或带key的参数kargs)。该方法位于django.urls模块。
  1. 模型中自定义get_absolute_url,并传递参数args
def get_absolute_url(self):
    return reverse('blog:article_detail', args=[str(self.pk), self.slug])
  1. 在视图中配合URL重定向使用,并传递kargs
from django.urls import reverse
from django.shortcuts import redirect

def my_view(request):
    ...
    return redirect(reverse('admin:app_list', kwargs={'app_label': 'auth'}))

作者:大江狗
来源:CSDN
原文:https://blog.csdn.net/weixin_42134789/article/details/81505963
版权声明:本文为博主原创文章,转载请附上博文链接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章