【问题标题】:Django form dispatch method : value error : view returned None instead of HttpResponseDjango 表单调度方法:值错误:视图返回 None 而不是 HttpResponse
【发布时间】:2016-03-23 15:39:31
【问题描述】:

我想做的事:

我正在检查用户是否来自“支持”组,然后他才能查看该页面。如果不是,我想在响应页面中向用户显示正确的消息。 我在 dispatch() 视图方法上应用了 group_required 装饰器,用于检查用户是否来自支持组。

我试过了

https://stackoverflow.com/a/29744943/2286762 但仍然收到 ValueError。

我的代码

view.py

class ScheduledTestView(FormView):
    '''
    Provides an admin panel interface for creating scheduled tests.
    Scheduled test will be created as active=False intially.
    '''
    serializer_class = TestShortSerializer
    template_name = 'admin/scheduled_test.html'
    form_class = ScheduledTestForm

    @method_decorator(group_required(['support']))
    def dispatch(self, request, *args, **kwargs):
        return super(ScheduledTestView, self).dispatch(request, *args, **kwargs)

group_required 函数

def group_required(group_names):
    """
     group_name will be the list of group name
    """
    def decorator(func):
        @wraps(func, assigned=available_attrs(func))
        def inner(request, *args, **kwargs):
            user = request.user
            if user.is_authenticated():
                if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser:
                    return func(request, *args, **kwargs)
                return redirect_to_login('/admin/')
        return inner
    return decorator

错误

获取 请求网址:http://localhost:8000/admin/support/scheduled_test/

Django 版本:1.8.4

异常类型:ValueError

异常值:
视图 support.views.ScheduledTestView 没有返回 HttpResponse 对象。它返回 None 。

异常位置:/home/kishan/.virtualenvs/kishan_pal/local/lib/python3.4/site-packages/django/core/handlers/base.py in get_response,第 151 行

【问题讨论】:

  • 如果用户未通过身份验证,inner 会返回什么?
  • 这就是问题所在。感谢您指出错误。

标签: python django django-forms django-admin django-views


【解决方案1】:

正如@Daniel Roseman 在您的问题下方的评论中提到的那样。如果用户未通过身份验证,则inner 不会返回任何响应,而在这种情况下它应该返回redirect_to_login('/admin/')

所以改变

def inner(request, *args, **kwargs):
    user = request.user
    if user.is_authenticated():
        if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser:
            return func(request, *args, **kwargs)
        return redirect_to_login('/admin/')

def inner(request, *args, **kwargs):
    user = request.user
    if user.is_authenticated():
        if (user.groups.filter(name__in=group_names) and user.is_staff) or user.is_superuser:
            return func(request, *args, **kwargs)
    return redirect_to_login('/admin/')

应该可以解决问题。看看return redirect_to_login('/admin/')if 块之外的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2017-01-25
    • 2018-09-14
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多