Django:reverse反转URL并传递参数
需求:
假设在文章详情页评论文章后需要重新刷新显示该页面(原始方法,提交评论表单为form方式,未采用ajax方式),
提交评论后代码会走comment的视图函数,等数据入库之后需要将页面重新定位到文章详情页面。
article_detail2.html页面
<!-- article_detail2.html --> <!-- 发表评论 -->
<br>
{% if user.is_authenticated %}
<div>
<form
action="{% url 'comment:post_comment' article.id %}"
method="POST"
>
{% csrf_token %}
<div class="form-group">
<label for="body">
<strong>
我也要发言:
</strong>
</label>
<textarea
type="text"
class="form-control"
id="body"
name="body"
rows="2"></textarea>
</div>
<!-- 提交按钮 -->
<button type="submit" class="btn btn-primary ">发送</button>
</form>
</div>
<br>
{% else %}
<br>
<h5 class="row justify-content-center">
请<a href="{% url 'account:user_login' %}">登录</a>后回复
</h5>
<br>
{% endif %}
URL路由
from django.conf.urls import url
from . import views, list_views
from haystack.views import SearchView urlpatterns=[
url(r'^article-column/$', views.article_column, name='article_column'),
url(r'^rename-column/$', views.rename_article_column, name='rename_article_column'),
url(r'^delete-column/$', views.delete_article_column, name='delete_column'),
url(r'^post-article/$', views.article_post, name='article_post'),
url(r'^article-list/$', views.article_list, name='article_list'),
url(r'^delete-article/$', views.delete_article, name='delete_article'),
url(r'^article-detail/(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.article_detail, name='article_detail'),
url(r'^re-edit-article/(?P<article_id>\d+)$', views.re_edit_article, name='re_edit_article'),
url(r'^list-article-titles/$', list_views.article_titles, name='list_article_titles'),
url(r'^list-article-titles-bysomeone/(?P<author>[-\w]+)/$', list_views.article_titles_by_someone, name='list_article_titles_bysomeone'), url(r'^upload/$', views.upload_img, name='upload_img'),
# url(r'^search/$', views.MySeachView, name='haystack_search'),
# SearchView()视图函数,默认使用的HTML模板路径为templates/search/search.html
url(r'search/$', SearchView(), name='haystack_search'),
]
评论视图函数:
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect, reverse from article.models import ArticlePost
from comment.forms import CommentForm
from .models import Comment
from utils.decorators import login_wrapper # Create your views here. # @login_wrapper
def post_comment(request, article_id, parent_comment_id=None):
article = get_object_or_404(ArticlePost, id=article_id)
slug = article.slug
print(article_id, parent_comment_id)
# 处理post请求
if request.method == 'POST':
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.article = article
new_comment.user = request.user # 二级回复
if parent_comment_id:
print('已请求')
parent_comment = Comment.objects.get(id=parent_comment_id)
# 若回复层级超过两级,则转为二级
new_comment.parent_id = parent_comment.get_root().id
# 被回复人
new_comment.reply_to = parent_comment.user
new_comment.save()
print('评论已写入')
return HttpResponse('200 OK') new_comment.save()
# 评论完成刷新该页面,后面优化为aja提交数据,局部刷新
# return redirect('article:list_article_titles')
# reverse反转url时需要传参数,要用到kwargs参数,会传入一个字典类型的参数
article_detail_url = reverse('article:article_detail', kwargs={'id': article_id, 'slug': slug})
return redirect(article_detail_url)
else:
return HttpResponse("表单有误,重新填写") elif request.method == 'GET':
print('获取评论')
comment_form = CommentForm()
context = {
'comment_form': comment_form,
'article_id': article_id,
'parent_comment_id': parent_comment_id
}
return render(request, 'comment/reply.html', context) else:
return HttpResponse("仅接受get或者post请求")
其中可以看到这两行:
article_detail_url = reverse('article:article_detail', kwargs={'id':article_id,'slug':slug})
return redirect(article_detail_url)
在评论视图中如果采用硬编码方式则为
article_detail_url = 'article/article-detail/%s/%s' % (article_id,slug)
return redirect(article_detail_url)
这样做的坏处就是,如果当文章详情页面的url变化之后,这里也要跟着修改,不符合DRY原则(Don`t Repeat Yourself)
使用reverse函数(意思是逆向、反转)代码中只要写对应url的name就实现了从name到path的转换,那为什么叫反转呢,因为URL配置中实现的是从path到name。
Django:reverse反转URL并传递参数的更多相关文章
- 转:Web页面通过URL地址传递参数常见问题及检测方法
Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述 ...
- 关于一些url中传递参数有空格问题
1.关于一些url中传递参数有空格问题: url.replace(/ /g, "%20") 从上面的例子中可以看到可以用:replace(/ /g, "%20" ...
- URL中传递参数给视图函数
1. 采用在url中使用变量的方式: 在path的第一个参数中,使用<参数名>的方式可以传递参数.然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找 ...
- url 传递参数(特殊字符)解决方法
url 传递参数(特殊字符)解决方法 首先设置 apache 配置文件, server.xml 在 port=8080 那一行中加上 URIEcoding=GBK 有些符号在URL中是不能直接传递的, ...
- Django学习手册 - reverse()反转URL
前端: <h1>测试</h1> <a href="/ce_test/?id=1">1按键</a> <a href=" ...
- 解决JS在url中传递参数时参数包含中文乱码的问题
1.传参页面JavaScript代码: function go_mark(id,jobname,headimgurl,nickname){ window.location.href = "m ...
- url如何传递参数
$(document).ready(function() { var name=getQueryString('minename'); if (name != null && name ...
- 通过注册的URL Scheme向目标APP传递参数
通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义U ...
- 关于Url传递参数
Url传递参数时,后台取值会直接取等号后面的内容,包括引号在内. 比如: http://localhost:8080/user?name='admin' 这是错误的做法,后台获取到的参数是包括引号 ...
随机推荐
- 进程间的通信----队列queue
import multiprocessing def download_from_web(q): """下载数据""" # 模拟下载数据 d ...
- sparkStreaming 读kafka的数据
目标:sparkStreaming每2s中读取一次kafka中的数据,进行单词计数. topic:topic1 broker list:192.168.1.126:9092,192.168.1.127 ...
- 内置对象(Math、Date、String、Array、基本包装类型)
一.内置对象 js中三种对象:内置对象.自定义对象.浏览器对象 实例对象是指通过构造函数创建出来,然后实例化的对象(new关键字) 静态对象是指不需要创建,直接调用的对象,可以在整个JS里调用的公共对 ...
- Ubuntu 下python开发环境的搭建
一.安装python3 ubuntu自身是安装python2的,例如在ubuntu 16.04中安装的就是python2.7.但我想在python3的环境下进行开发所以就要安装python3.但由于u ...
- All 关键字
本文档已存档,并且将不进行维护. GROUP BY 子句和 ALL 关键字 SQL Server 2005 Transact-SQL 在 GROUP BY 子句中提供 ALL 关键字.只有在 SELE ...
- P2679 子串 DP
P2679 子串 DP 从字符串A中取出\(k\)段子串,按原顺序拼接,问存在多少个方案使拼接的字符串与字符串B相同 淦,又是这种字符串dp 设状态\(ans[i][j][k]\)表示A串位置\(i\ ...
- Bacteria (Gym - 101911C)
2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage Bacteria Gym - 101911C ...
- springboot项目整合swagger2出现的问题
swagger需要开放以下uri:/swagger-ui.html/swagger-resources/webjars/csrf/v2 添加swagger后项目报错 Failed to start b ...
- MongoDB与RoboMongo的安装+python基本操作MongoDB
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据 ...
- Java 面向对象(十三)
异常 什么是异常 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象. ...