我需要在我的 django 项目中构建一个类似评论的应用程序,该应用程序有一个视图来接收提交的表单处理它并将错误返回到它来自哪里。我终于设法让它工作,但我怀疑使用它的方式可能是错误的,因为我在会话中传递了整个经过验证的表单。
下面是代码
评论/模板标签/comment.py
@register.inclusion_tag('comment/form.html', takes_context=True)
def comment_form(context, model, object_id, next):
"""
comment_form()
is responsible for rendering the comment form
"""
# clear sessions from variable incase it was found
content_type = ContentType.objects.get_for_model(model)
try:
request = context['request']
if request.session.get('comment_form', False):
form = CommentForm(request.session['comment_form'])
form.fields['content_type'].initial = 15
form.fields['object_id'].initial = 2
form.fields['next'].initial = next
else:
form = CommentForm(initial={
'content_type' : content_type.id,
'object_id' : object_id,
'next' : next
})
except Exception as e:
logging.error(str(e))
form = None
return {
'form' : form
}
评论/view.py
def save_comment(request):
"""
save_comment:
"""
if request.method == 'POST':
# clear sessions from variable incase it was found
if request.session.get('comment_form', False):
del request.session['comment_form']
form = CommentForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
if request.user.is_authenticated():
obj.created_by = request.user
obj.save()
messages.info(request, _('Your comment has been posted.'))
return redirect(form.data.get('next'))
else:
request.session['comment_form'] = request.POST
return redirect(form.data.get('next'))
else:
raise Http404
用法是通过加载模板标签并触发
{% comment_form article article.id article.get_absolute_url %}
我怀疑是否通过将经过验证的表单传递给会话来执行正确的方法。那会是个问题吗?安全风险?性能问题?
请指教
更新
回答波尔的问题。我采用这种方法的原因是因为评论表单是在单独的应用程序中处理的。在我的场景中,我渲染了诸如文章之类的对象,我所做的只是调用模板标签来渲染表单。我的情况有什么替代方法?
您还与我分享了 django 评论应用程序,该应用程序知道,但正在使用的客户需要在评论应用程序中完成大量复杂的工作,这就是为什么要开发一个新的。