Django - AJAX-SELECT 403禁止

cle*_*ula 3 django lookup django-ajax-selects

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

发生的事情是,当我使用没有管理员权限的用户登录时,我会在服务器上获得此行

[16/Aug/2012 14:56:12] "GET /profile/ajax_lookup/areas2?term=g HTTP/1.1" 403 22
Run Code Online (Sandbox Code Playgroud)

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

我的查找频道:

AJAX_LOOKUP_CHANNELS = {
'areas'  : {'model':'mycu.areas', 'search_field':'type'},
'areas2' : ('mycu.lookups', 'AreasLookup'),
Run Code Online (Sandbox Code Playgroud)

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

如果没有ModelForm上的'make_ajax_fields'行,我可以轻松访问模型区域.

我不知道的是:

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

谢谢,

Mar*_*vin 5

django-ajax-choices的默认权限要求用户为staff(user.is_staff).请参阅https://github.com/crucialfelix/django-ajax-selects#check_authselfrequest中有关更改此默认值的README说明.LookupChannel

check_auth(个体,请求):

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

面向公众的表单应编写自定义LookupChannel以根据需要实现.你也可以选择返回HttpResponseForbidden("你是谁?")而不是提高PermissionDenied

这错误地表明它将返回401状态代码,而实际上Django将处理PermissionDenied与您所看到的403响应.