ここでは、djangoプロジェクトでコメントのようなアプリを作成する必要があります。このアプリには、送信されたフォームを受信して処理し、エラーを元の場所に返すビューがあります。私はついにそれを機能させることができましたが、セッションで検証済みのフォーム全体を渡しているので、それを使用する方法が間違っている可能性があるかどうかは疑問です。
以下はコードです
コメント/templatetags/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
}
comment / 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コメントアプリを共有しました。これは認識していますが、クライアントが作業している場合は、コメントアプリで多くの複雑な作業を行う必要があるため、新しいアプリに取り組んでいます。