您如何将“异常”参数传递给 403 视图?

Aux*_*roc 2 django django-views

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

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

TypeError at /403/
permission_denied() missing 1 required positional argument: 'exception'
Run Code Online (Sandbox Code Playgroud)

看法

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

...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Aux*_*roc 6

我认为这个问题与如何为本地开发配置 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)
Run Code Online (Sandbox Code Playgroud)

如果 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)),
        ]
Run Code Online (Sandbox Code Playgroud)