美文网首页
HttpResponseRedirect, redirect和r

HttpResponseRedirect, redirect和r

作者: 叶田的学习笔记 | 来源:发表于2018-10-16 19:10 被阅读0次

    1、HttpResponseRedirect —— django.http

    HttpReponseDirect只支持hard coded urls(硬编码链接), 不能直接使用命名的URL,如使用HttpResponseDirect('blog:article_list‘)是错误的。在使用URL命名时,我们需要先通过URL反向解析方法reverse先对命名URL(article_list)进行解析,然后再使用HttpReponseRedirect定向(如下面的代码)。背后的逻辑是reverse('blog:article_list')='/index/'。

    对于包含参数的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})
    

    2、redirect —— django.shortcuts

    以下是3种redirect重定向方法:

    from django.shortcuts import redirect
    from django.urls import reverse
    
    # 案例1
    def my_view(request):
        ...
        return redirect('/index/')
    
    # 案例2
    def my_view(request):
        ...
        return redirect('https://www.baidu.com/')
    
    # 案例3
    def my_view(request):
        ...
        return redirect(reverse('blog:article_list'))
    

    不仅能根据URL重定向,还可以根据对象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)
    

    2)根据视图View重定向

    使用该方法的前提已对URL进行了命名,且对应了相应的视图。下面案例中redirect会先根据视图函数的名字查找对应url,在传递额外参数。后台工作还是由reverse方法来完成的。

    def my_view(request):
        ...
        return redirect('some-view-name', foo='bar')
    

    3、reverse —— django.urls

    reverse方法的作用是对已命名的URL进行反向解析,还传递相应的参数(args或带key的参数kargs)。reverse方法一般有2种应用场景:
    在模型中自定义get_absolute_url时使用,传递参数;
    在视图中对命名URL进行解析,传递参数,再使用HttpResponseDirect和redict进行重定向。

    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'}))
    

    reverse方法不仅能对命名的urls进行反向解析,还可以对视图函数进行反向解析,找到需要重新定向的url, 如下面代码所示。当然但这个方法并不推荐使用。与此功能相反的是resolve方法,该方法可以根据url找到对应视图函数。

    from django.urls import reverse
    from blog import views
    reverse(views.index)
    

    相关文章

      网友评论

          本文标题:HttpResponseRedirect, redirect和r

          本文链接:https://www.haomeiwen.com/subject/hpzhzftx.html