Django - AJAX-SELECT 403 Forbidden



我使用 django-ajax-select 为模型区域上的字段创建了一个查找通道,以便在创建或编辑 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))

没有模型表单上的"make_ajax_fields"行,我可以轻松访问模型区域。

我没有弄清楚的是:

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

谢谢

django-ajax-selects的默认权限要求用户是工作人员(user.is_staff)。请参阅有关在LookupChannel https://github.com/crucialfelix/django-ajax-selects#check_authselfrequest 中更改此默认值的自述文件说明

check_auth(自我,请求):

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

面向公众的表单应编写自定义查找通道来实现 根据需要。您也可以选择返回 HttpResponseForbidden("who) 是你吗?而不是引发权限被拒绝

这错误地指出它将返回 401 状态代码,而实际上 Django 将使用 403 响应处理PermissionDenied,就像你所看到的一样。

Lavin 如何@Mark说:

只是像这样覆盖自定义查找香奈儿上的函数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))

最新更新