【问题标题】:How do you pass 'exception' argument to 403 view?您如何将“异常”参数传递给 403 视图?
【发布时间】:2017-03-19 02:24:48
【问题描述】:

**编辑:当然,我突然意识到这与 UserPassesTextMixin 没有任何关系,因为在尝试直接访问 403 页面时会弹出此错误。仍然不知道该怎么做。

我正在尝试使用 UserPassesTestMixin 检查正在请求哪个模型的编辑视图并运行特定于该模型的测试以查看用户是否应该具有访问权限。还没有任何工作,我只是想了解一下这个 mixin 是如何工作的。在 test_func 中返回 false 后,视图尝试重定向到 /403/,但出现以下错误。

TypeError at /403/
permission_denied() missing 1 required positional argument: 'exception'

查看

class DeviceUpdate(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Device
    template_name_suffix = '_update_form'
    form_class = DeviceUpdateForm

    def test_func(self):
        return edit_permission_test(self.get_object())

...

perms.py

def edit_permission_test(model_object):
    possible_models = ['Device',]
    if isinstance(model_object, Device):
        print('This is a Device model object')
        return True
    else:
        print('This doesnt look like a Device model object')
        return False

我似乎无法在互联网上找到任何有助于解决此错误的信息。

【问题讨论】:

  • 附加到哪个视图/403/ url?你能包含那个视图的代码吗?
  • 我更改了主 urls.py 中的 url 模式。请参阅下面的答案。这看起来像一个好的解决方案吗?

标签: django django-views


【解决方案1】:

我认为这个问题与如何为本地开发配置 url 模式有关。以前我的主要 urls.py 看起来像这样:

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='pages/home.html'), name="home"),

    ...

    # Your stuff: custom urls includes go here
    url(r'^devices/', include('auto_toner.urls', namespace='auto_toner', app_name='auto_toner'), name="devices"),

    url(r'^400/$', default_views.bad_request),
    url(r'^403/$', default_views.permission_denied),
    url(r'^404/$', default_views.page_not_found),
    url(r'^500/$', default_views.server_error),


] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

如果 settings.DEBUG 为 True,我将 URL 更改为在模式中包含 kwargs。

if settings.DEBUG:
    # This allows the error pages to be debugged during development, just visit
    # these url in browser to see how these error pages look like.
    urlpatterns += [
        url(r'^400/$', default_views.bad_request, kwargs={'exception': Exception('Bad Request!')}),
        url(r'^403/$', default_views.permission_denied, kwargs={'exception': Exception('Permission Denied')}),
        url(r'^404/$', default_views.page_not_found, kwargs={'exception': Exception('Page not Found')}),
        url(r'^500/$', default_views.server_error),
    ]
    if 'debug_toolbar' in settings.INSTALLED_APPS:
        import debug_toolbar

        urlpatterns += [
            url(r'^__debug__/', include(debug_toolbar.urls)),
        ]

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2011-06-27
    • 2015-10-02
    • 1970-01-01
    • 2022-11-23
    • 2018-01-08
    • 2011-10-07
    • 2011-06-16
    相关资源
    最近更新 更多