【问题标题】:Django - AJAX-SELECT 403 ForbiddenDjango - AJAX-SELECT 403 禁止
【发布时间】:2012-08-13 02:16:14
【问题描述】:

我使用 django-ajax-select 为 Model Areas 上的一个字段创建了一个查找通道,以便在我创建或编辑 UserProfile 时在我的 ModelForm 上使用它来选择字段。

class FormRegisterProfile(forms.ModelForm):

class Meta: 
    model = UserProfile
    exclude = ('user')

interests  = make_ajax_field(UserProfile,'interests','areas2',help_text=True)
expertise  = make_ajax_field(UserProfile,'expertise','areas2',help_text=True)    

发生的情况是,当我使用没有管理员权限的用户登录时,我会在服务器上看到这一行

[16/Aug/2012 14:56:12] "GET /profile/ajax_lookup/areas2?term=g HTTP/1.1" 403 22

我的 url.py

(r'^admin/lookups/', include(ajax_select_urls)),
(r'^profile/', include(ajax_select_urls)),
url(r'^profile/edit/$', 'mycu.views.EditUserProfile', {}, 'register.html'),
url(r'^admin/', include(admin.site.urls)),

我的查找频道:

AJAX_LOOKUP_CHANNELS = {
'areas'  : {'model':'mycu.areas', 'search_field':'type'},
'areas2' : ('mycu.lookups', 'AreasLookup'),

我的lookups.py

class AreasLookup(LookupChannel):

    model = Areas

    def get_query(self,q,request):
        return Areas.objects.filter(Q(type__icontains=q)).order_by('type')

    def get_result(self,obj):
        u""" result is the simple text that is the completion of what the person typed """
        return obj.type

    def format_match(self,obj):
        """ (HTML) formatted item for display in the dropdown """
        return self.format_item_display(obj)

    def format_item_display(self,obj):
        """ (HTML) formatted item for displaying item in the selected deck area """
        return u"%s" % (escape(obj.type))

没有 ModelForm 上的“make_ajax_fields”行,我可以轻松访问模型区域。

我不明白的是:

管理员/查找之间的关系是什么

谢谢,

【问题讨论】:

    标签: django lookup django-ajax-selects


    【解决方案1】:

    @Mark Lavin 怎么说:

    只是像这样覆盖自定义 LookupChanel 上的函数 check_auth:

    class AreasLookup(LookupChannel):
    
        model = Areas
    
        def check_auth(self, request):
            if request.user.get_profile() :
                return True
    
        def get_query(self,q,request):
            return Areas.objects.filter(Q(type__icontains=q)).order_by('type')
    
        def get_result(self,obj):
            u""" result is the simple text that is the completion of what the person typed """
            return obj.type
    
        def format_match(self,obj):
            """ (HTML) formatted item for display in the dropdown """
            return self.format_item_display(obj)
    
        def format_item_display(self,obj):
            """ (HTML) formatted item for displaying item in the selected deck area """
            return u"%s" % (escape(obj.type))
    

    【讨论】:

      【解决方案2】:

      django-ajax-selects 的默认权限要求用户是员工 (user.is_staff)。在LookupChannelhttps://github.com/crucialfelix/django-ajax-selects#check_authselfrequest中查看有关更改此默认值的自述文件

      check_auth(self,request):

      为了确保没有人可以通过 json 获取您的数据,只需知道 网址。默认将其限制为 request.user.is_staff 并引发 PermissionDenied 异常。默认情况下,这是一个 401 错误 响应,但您的中间件可能会拦截并选择执行其他操作 东西。

      面向公众的表单应该编写一个自定义的 LookupChannel 来实现 如所须。您也可以选择返回 HttpResponseForbidden("who 你是吗?”)而不是提高 PermissionDenied

      这错误地表明它将返回 401 状态代码,而实际上 Django 将处理 PermissionDenied 并带有 403 响应,就像您看到的那样。

      【讨论】:

      • 其实我已经做了一个自定义的 LookupChannel,我只是没有写在这个线程上。我编辑了我的帖子,请再看一遍,我不知道如何解决...谢谢,
      • 你看我的回答了吗?您需要更改check_auth 以允许非员工用户。
      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2014-01-25
      • 2019-07-16
      相关资源
      最近更新 更多