Django 1.6 - 重定向的可重用视图

时间:2014-04-26 13:35:06

标签: django

我刚刚制作了可以附加到任何型号的可重复使用的评论应用程序,请参阅我遇到问题的视图(我没有包含整个逻辑,只包含与问题相关的逻辑)。

当没有request.POST时,一切正常,但是当我尝试添加评论时,保存后出现重定向问题,我收到错误

dictionary update sequence element #0 has length 0; 2 is required

有问题的行是context.update(字典)。添加评论时看起来似乎是空的,但我不明白为什么。

我的逻辑是:

  1. 当没有request.POST时,查看add_comment将返回 {' comment_form&#39 ;: comment_form,' comments&#39 ;: comments}

  2. request.method==POST'时,context.update(dictionary)不应该。{li>

    甚至被执行,因为返回重定向(节点)。应该结果 启动代码在视图配置文件中执行,因为它在哪里 重定向(节点)应该导致。

  3. 我知道我可以在profile.views.py中使用重定向,但是我需要为每个带有添加注释的视图执行此操作,这非常不方便。

    comment.views.py

    from django.shortcuts import redirect
    from comment.forms import AddCommentForm
    from comment.models import Comment
    
    def add_comment(request, node):
        if request.user.is_authenticated():
            user = request.user
        else:
            user = None
            comment_form = None
        comments = Comment.objects.get_comments(node) # custom manager method for getting all comments
        if user:
            if request.method == 'POST':
                comment_form = AddCommentForm(request.POST)
                if comment_form.is_valid():
                    comment_form.save(node=node, user=user) # custom form save method, updating missing fields
                    return redirect(node) #redirect to node.get_absolute_url()
            else:
                comment_form = AddCommentForm()
        return {'comment_form': comment_form, 'comments': comments}
    

    profile.views.py - 另一个应用,我想通过仅引用视图add_comment来减少添加评论的代码

    from django.shortcuts import render, get_object_or_404
    from django.contrib.auth.models import User
    from comment.views import add_comment
    
    def profile(request, id):
        user = get_object_or_404(User, id=id)
        dictionary = add_comment(request, user)
        context = {'user': user}
        context.update(dictionary) #problematic line
        return render(request, 'profile/profile account.html', context)
    

1 个答案:

答案 0 :(得分:0)

问题是add_comment可以返回不是字典的东西:即重定向(它是HttpResponse的子类)。在使用之前,您总是可以检查返回的类型:

result = add_comment(request, user)
if not isinstance(result, dict):
    return result
else:
    context.update(result)