需求:

  假设在文章详情页评论文章后需要重新刷新显示该页面(原始方法,提交评论表单为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并传递参数的更多相关文章

  1. 转:Web页面通过URL地址传递参数常见问题及检测方法

    Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述 ...

  2. 关于一些url中传递参数有空格问题

    1.关于一些url中传递参数有空格问题: url.replace(/ /g, "%20") 从上面的例子中可以看到可以用:replace(/ /g, "%20" ...

  3. URL中传递参数给视图函数

    1. 采用在url中使用变量的方式: 在path的第一个参数中,使用<参数名>的方式可以传递参数.然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找 ...

  4. url&nbsp;传递参数(特殊字符)解决方法

    url 传递参数(特殊字符)解决方法 首先设置 apache 配置文件, server.xml 在 port=8080 那一行中加上 URIEcoding=GBK 有些符号在URL中是不能直接传递的, ...

  5. Django学习手册 - reverse()反转URL

    前端: <h1>测试</h1> <a href="/ce_test/?id=1">1按键</a> <a href=" ...

  6. 解决JS在url中传递参数时参数包含中文乱码的问题

    1.传参页面JavaScript代码: function go_mark(id,jobname,headimgurl,nickname){ window.location.href = "m ...

  7. url如何传递参数

    $(document).ready(function() { var name=getQueryString('minename'); if (name != null && name ...

  8. 通过注册的URL Scheme向目标APP传递参数

    通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义U ...

  9. 关于Url传递参数

    Url传递参数时,后台取值会直接取等号后面的内容,包括引号在内. 比如:   http://localhost:8080/user?name='admin' 这是错误的做法,后台获取到的参数是包括引号 ...

随机推荐

  1. 安装部署mongodb

    准备 groupadd mongodb useradd -g mongodb mongodb echo password |passwd --stdin mongodb mkdir -pv /data ...

  2. 遍历器Iterator--指针对象

    一. 什么是遍历器 1. 遍历器对象(Iterator) 遍历器对象本质上是一个指针对象,该对象有一个next方法,调用next方法返回一个 含有value和done属性的对象{value: val/ ...

  3. sql server 存储过程---游标的循环

    sqlserver中的循环遍历(普通循环和游标循环) sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student

  4. react图片预览插件尝试

    npm install react-zmage -S https://blog.csdn.net/Wcharles666/article/details/90262525 启动报错 直接执行  npm ...

  5. JavaScript 取两位小数有效数字

    a=2.33332.3333a.toFixed(2)"2.33"

  6. vue中点击复制粘贴功能 clipboard 移动端

    页面是由 v-for 循环渲染出来,要给每一个结构里面的复制按钮加一个复制功能 npm install clipboard --save    安装,如果安装处问题,多安装几次,我自己也安装了好几次 ...

  7. (转)hadoop 常规错误问题(一)

    转至:http://www.freeoa.net/osuport/db/my-hbase-usage-problem-sets_2979.html 本文是我在使用Hbase的过程碰到的一些问题和相应的 ...

  8. Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure........

    iframe引入视频的文件的时候报这个错 其实只要改成 加上一个s就好了  ...

  9. Go by Example-循环

    Go By Example-循环语句 Go和其他大多数语言不太一样,没有While和Do-Whiile形式的循环,只有一个for,来实现循环. 基本结构 for循环的基本结构是这个样子 for 变量; ...

  10. 20175234 2018-2019-2 《Java程序设计》第十周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第十周学习总结 教材学习内容总结 12.1进程与线程 12.2 Java中的线程 12.3 Thread类与线程的创建 ...