1

ここでは、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コメントアプリを共有しました。これは認識していますが、クライアントが作業している場合は、コメントアプリで多くの複雑な作業を行う必要があるため、新しいアプリに取り組んでいます。

4

1 に答える 1

1

セッションの保存にCookieを使用している場合を除いて、セキュリティの問題はわかりません。パフォーマンスは、どのような種類のセッションバックを使用しているかによっても異なります。しかし、なぜあなたは物事を複雑にしているのかという点を見つけることができません!

そして、テンプレートタグでセッションに触れることはまったく良い考えではありません。

そして多分djangoコメントフレームワークを見てください

アップデート:

Ok。合併症を除いて、このアプローチの問題はわかりません。たとえば、私のプロジェクトでは、ajaxを使用してデータを送信し、コメントビューで正しく検証しているため、元のページにリダイレクトする必要はありません。もう1つは、初期化されたフォームを記事ビューで渡すため、テンプレートタグを使用していないことです。

例として、私のアプローチを提供できます。

from forms import CommentForm
from models import Comment
from django.http import HttpResponseForbidden, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import simplejson
from etv_persons.person.models import Person
from django.contrib import messages

def create_comment(request,slug):
    if request.method != 'POST' or not request.POST or request.user.is_anonymous():
        return HttpResponseForbidden('Доступ запрещен')

    person = get_object_or_404(Person,slug=slug)
    form = CommentForm(data=request.POST)
    if form.is_valid():
        Comment.objects.create(user_id=request.user.id, person=person,text=form.cleaned_data['text'])
        if request.is_ajax(): 
            msg={'msg': 'Cement was send',}
        else: 
            messages.info(request, 'COmment was send.')
    else:
        if request.is_ajax(): msg={'msg': 'Error.',}
        else: messages.info(request, 'Error.')
    if request.is_ajax():
        return HttpResponse(simplejson.dumps(msg),content_type='application/json')
    else:  
        return redirect('person_details',**{"slug":slug,"ptype":person.type})

そして、記事ビューでは、次のことを行います。

response['comment_form'] = CommentForm()

はい、コメントフォームを検証しません。理由はありません。たった1つのテキスト入力。

于 2012-12-08T15:46:12.127 に答える