截下来通过新增评论功能,尝试表单的提交
html代码如下
<form action="{% url 'saveComment' %}" method="post" name="saypl" id="saypl"
onsubmit="return CheckPl(document.saypl)">
<div id="plpost">
<p class="saying"></span>来说两句吧...</p>
<input type="hidden" name="art_id" value="{{article.id}}">
<textarea name="comment" rows="6" id="saytext"></textarea>
<input name="imageField" type="submit" value="提交">
</div>
</form>
模型
#评论
class Comment(models.Model):
art= models.ForeignKey(Articles,on_delete=models.CASCADE)#文章ID
comment = models.CharField(max_length = 200,null = False)
com_date = models.DateField(auto_now_add=True)#发表日期
views.py
from django.shortcuts import render,get_object_or_404
from django.http import Http404, HttpResponseRedirect
from .models import *
from django.urls import reverse
# 保存评论
def saveComment(request):
article = get_object_or_404(Articles,id =request.POST['art_id'])
com = Comment()
com.comment = request.POST['comment']
com.art = article
com.save()
return HttpResponseRedirect(reverse('articleInfo', args=(request.POST['art_id'])))
url
path('article/comment/', views.saveComment , name ='saveComment')
讲解
由于我们创建一个 POST 表单(它具有修改数据的作用),所以我们需要小心跨站点请求伪造。 谢天谢地,你不必太过担心,因为 Django 已经拥有一个用来防御它的非常容易使用的系统。 简而言之,所有针对内部 URL 的 POST 表单都应该使用 {%csrf_token %}模板标签。在这里我们先不理会这个,先禁用这个功能,修改setting.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
request.POST 是一个类字典对象,让你可以通过关键字的名字获取提交的数据。 这个例子中, request.POST['art_id']
以字符串形式返回选择的art_id
。request.POST的值永远是字符串。
注意,Django 还以同样的方式提供 request.GET用于访问 GET 数据 —— 但我们在代码中显式地使用 request.POST ,以保证数据只能通过 POST 调用改动。
代码返回一个 HttpResponseRedirect 而不是常用的 HttpResponse 、HttpResponseRedirect 只接收一个参数:用户将要被重定向的 URL(请继续看下去,我们将会解释如何构造这个例子中的 URL)。
在这个例子中,我们在HttpResponseRedirect 的构造函数中使用 reverse()
函数。这个函数避免了我们在视图函数中硬编码 URL。它需要我们给出我们想要跳转的视图的名字和该视图所对应的 URL 模式中需要给该视图提供的参数。 在本例中,使用之前设定的 URLconf, reverse()
调用将返回一个这样的字符串:
article/info/<int:article_id>/
reverse('articleInfo', args=(request.POST['art_id']))
其中articleInfo对应url中的name,args将会替代<int:article_id>
项目地址(码云):传送门