1

我需要在我的 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 评论应用程序,该应用程序知道,但正在使用的客户需要在评论应用程序中完成大量复杂的工作,这就是为什么要开发一个新的。

4

1 回答 1

1

我没有看到安全问题,除非您使用 cookie 来存储会话。性能取决于您使用的会话类型。但我找不到重点,你为什么要把事情复杂化!

而且我根本不认为模板标签中的触摸会话是一个好主意。

也许看看 django评论框架

更新:

好的。除了复杂性之外,我看不到这种方法的问题。例如在我的项目中,我使用 ajax 发送数据并在评论视图中正确验证它,因此我不需要重定向到原始页面。另一件事是我在文章视图中传递了初始化的表单,所以我没有使用模板标签。

可以为您提供我的方法,例如:

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

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

于 2012-12-08T15:46:12.127 回答