处理来自不同视图的表单并通过django中的会话传递表单验证

时间:2012-12-08 11:15:44

标签: django

我有一个要求在我的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
    }

评论/ 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 %}

我怀疑是否通过将经过验证的表单传递给会话来做正确的方法。那会是个问题吗?安全风险?性能问题?

请告知

更新

回应Pol问题。我采用这种方法的原因是因为评论表单是在一个单独的应用程序中处理的。在我的场景中,我渲染文章等对象,我所做的就是调用templatetag来渲染表单。对我的案子来说,另一种方法是什么?

您还与我分享了django评论应用程序,它知道但客户端正在处理需要在评论应用程序中完成许多复杂的工作,这就是为什么要处理新的工作。

1 个答案:

答案 0 :(得分:1)

我没有看到安全性问题,除了使用cookie进行stroring会话的情况。性能取决于您正在使用的会话类型。但我无法找到问题为什么让事情复杂化!

我不喜欢在模板标签中触摸会话是一个好主意。

也许看看django Comments Framework

<强>更新

确定。除了并发症,我无法看到这种方法存在的问题。例如,在我的项目中,我正在使用ajax发送数据并在评论视图中对其进行验证,因此我不需要重定向到原始页面。另一件事是我在文章视图中传递了初始化的Form,所以我没有使用templatetags。

出于示例目的,可以为您提供我的approche:

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()

是的,我没有验证评论表。没有理由。只需一个文字输入。