我使用django-ajax-select为模型区域上的字段创建了一个查找通道,用于在我的ModelForm上创建或编辑UserProfile时选择字段。
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
my 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'行,我可以轻松访问模型区域。
我不知道的是:
admin / lookups之间的关系是什么
谢谢,
答案 0 :(得分:5)
django-ajax-choices的默认权限要求用户为职员(user.is_staff
)。请参阅有关在LookupChannel
https://github.com/crucialfelix/django-ajax-selects#check_authselfrequest
check_auth(个体,请求):
确保没有人能够通过json获取您的数据 URL。默认是将其限制为request.user.is_staff并引发一个 PermissionDenied异常。默认情况下,这是401的错误 响应,但您的中间件可能会拦截并选择执行其他操作 的东西。
面向公众的表单应该编写一个自定义的LookupChannel来实现 如所须。你也可以选择返回HttpResponseForbidden(“谁 你呢?“)而不是提出PermissionDenied
这错误地表明它将返回401状态代码,而事实上Django将使用您所看到的403响应来处理PermissionDenied
。
答案 1 :(得分:3)
@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))