Django之跳转回原路径

  问题:图书管理系统点击编辑之后跳转的不是当前编辑的页数,
  而是跳转到了第一页去了,这对用户来说是体验很不好的,
  编辑完成之后还要翻到那一页看一下有没有编辑成功,下面就来解决一下这个问题:

实现思路:

在get请求路劲中加一个next参数,后端获取next参数的值进行跳转
<a href="{% url 'app02:edit_book' book_obj.nid %?next=/show_book/?page=2}">编辑</a>

后端代码:

next_url = request.GET.get('next')
print(next_url)
book_model_form = BookModelForm(request.POST,instance=book_id)
if book_model_form.is_valid():
    book_model_form.save()
    return redirect(next_url)

但是上面编辑的a标签中的next参数的page值给写死了,这里怎么变化起来呢,可以使用自定义标签来实现:
思路讲解:
form表单中的action参数如果什么也不写,就是往当前路径下提交,后端在处理的时候如果验证成功就跳转到首页,这里将编辑页面和首页url整合成一个,下次再跳转的时候就获取next的值进行跳转就是下面写的1、2项。
1.首先获取url的路径,使用get_full_path获取路径和get请求携带的参数。(/app02/show_book/?page=2)
2.获取编辑路径,将get_full_path获取到值和编辑路径拼接。
(/app02/edit_book/48/?next=/app02/show_book/?page=2)

代码如下:

<a href="{% reverse_url request 'app02:edit_book' book_obj.nid %}">编辑</a>

自定义标签:

@register.simple_tag
def reverse_url(request,url_name,book_id):
    next_url = request.get_full_path()  #/app02/show_book/?page=2
    reverse_url = reverse(url_name,args=(book_id,))  #/app02/edit_book/47/
    full_url = reverse_url + '?next=' +  next_url
    print(full_url) #/app02/edit_book/48/?next=/app02/show_book/?page=2
    return full_url

后端逻辑不变:

next_url = request.GET.get('next')
print(next_url)
book_model_form = BookModelForm(request.POST,instance=book_id)
if book_model_form.is_valid():
    book_model_form.save()
    return redirect(next_url) #这里获取的就是/app02/show_book/?page=编辑的页数

问题又来了:
如果搜索出来的结果想编辑,这时就有问题了,可以看到已经获取不到后面的page了,跳转的时候肯定就有问题,会跳转到第一页去。
在这里插入图片描述
实现思路:
如果想加上搜索条件编辑之后还跳转到带有搜索条件的页面就要用到url编码,因为django后端会拆分路径,这样就没办法保存搜索条件。
django会按照路径来拆分路径:
/app02/edit_book/48/?next=/app02/show_book/?page=2
拆分如下:
等号前面是键,后面是值,遇到&符合就会分割
request.GET[‘next’] = ‘/app02/show_book/?page=2’
request.GET[‘search_field’] = ‘title__contains’
这样就没办法保存搜索条件了 需要用到urlencode()
需要用到QueryDict这个对象,因为urlencode是这个对象里面的方法。

代码如下:

@register.simple_tag
def reverse_url(request, url_name, book_id):
    next_url = request.get_full_path()  # /app02/show_book/?page=2
    reverse_url = reverse(url_name, args=(book_id,))  # /app02/edit_book/47/
    q_obj = QueryDict()
    q_obj['next'] = next_url
    full_url = reverse_url + '?next=' + next_url     #/app02/edit_book/48/?next=/app02/show_book/?page=2
    return full_url

眼熟吧:
在这里插入图片描述
实例化QueryDict对象的时候需要传一个参数mutable=True
自定义标签修改后:

@register.simple_tag
def reverse_url(request, url_name, book_id):
    next_url = request.get_full_path()  # /app02/show_book/?page=2
    reverse_url = reverse(url_name, args=(book_id,))  # /app02/edit_book/47/
    q_obj = QueryDict(mutable=True)
    q_obj['next'] = next_url
    next_url = q_obj.urlencode() # 一个整体的数据
    print(next_url)  #结果:next=%2Fapp02%2Fshow_book%2F%3Fsearch_field%3Dtitle__contains%26kw%3D123456
    full_url = reverse_url + '?' + next_url     #/app02/edit_book/48/?next=/app02/show_book/?page=2
    return full_url

urlencode做了那些事:

拼接查询参数的时候 q['next']这就是一个键  后面的next_url就是整体的值:/app02/edit_book/48/?next=/app02/show_book/?page=2
后面的值如果有不安全的字符全部替换成ascii码里面十六进制表示的字符 next=%2Fapp02%2Fshow_book%2F%3Fsearch_field%3Dtitle__contains%26kw%3D123456
如果不编码的话后端就会把他们分开成这种了request.GET['search_field'] = '123456'  
编码之后:
next=%2Fapp02%2Fshow_book%2F%3Fsearch_field%3Dtitle__contains%26kw%3D123456

后端获取路劲的时候也会解码。
ascii码表,刚好对应上面编码之后的url:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39253370/article/details/106183440
今日推荐