2012-08-16 69 views
3

我做了一个查询通道,使用Django的Ajax-选择,对示范区的现场,用我的ModelForm,选择字段,当我创建或编辑用户配置。Django的 - AJAX-SELECT 403禁止

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'), 

我的查找的.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' 上的ModelForm线,我可以很容易地访问示范区。

什么,我没有想出是:

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

感谢,

回答

5

Django的阿贾克斯,选择默认权限要求用户是工作人员( user.is_staff)。查看你的LookupChannelhttps://github.com/crucialfelix/django-ajax-selects#check_authselfrequest

check_auth更改此默认(自我,请求)的自述注:

,确保没有人可以简单地通过了解 URL获得通过JSON数据。默认情况下,将其限制为request.user.is_staff并引发一个 PermissionDenied异常。默认情况下,这是401 响应的错误,但是您的中间件可能会拦截并选择执行其他 的事情。

面向公众的形式应该写一个自定义LookupChannel根据需要实施 。你也可以选择退货HttpResponseForbidden(“谁 是你吗?”),而不是提高PermissionDenied

这错误地指出它会返回401个状态码的时候,其实Django会与像403的响应处理PermissionDenied你看到了。

+0

其实我已经做了一个自定义的LookupChannel,我只是没有在此线程写道。我编辑我的职务,请再看一次,我没有想出如何解决...... 感谢, – cleliodpaula 2012-08-16 17:58:45

+0

你看了我的答案吗?您需要更改'check_auth'以允许非职员用户。 – 2012-08-16 18:03:44

3

如何@马克·拉文说:

只是覆盖定制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))