3

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

ModelFormに「make_ajax_fields」行がなくても、モデル領域に簡単にアクセスできます。

私が理解していないのは:

管理者/ルックアップ間の関係は何ですか

ありがとう、

4

2 に答える 2

5

django-ajax-selectsのデフォルトの権限では、ユーザーはスタッフ(user.is_staff)である必要があります。https://github.com/crucialfelix/django-ajax-selects#check_authselfrequestでこのデフォルトの変更に関するREADMEノートを参照してくださいLookupChannel

check_auth(self、request):

URLを知っているだけで誰もjson経由でデータを取得できないようにするため。デフォルトでは、request.user.is_staffに制限し、PermissionDenied例外を発生させます。デフォルトでは、これは401応答のエラーですが、ミドルウェアがインターセプトして他のことを選択する場合があります。

公開フォームは、必要に応じて実装するカスタムLookupChannelを作成する必要があります。また、PermissionDeniedを発生させる代わりに、HttpResponseForbidden( "who are you?")を返すことを選択できます。

PermissionDeniedこれは、実際にはDjangoがあなたが見ているように403応答でを処理するときに、401ステータスコードを返すと誤って述べています。

于 2012-08-16T17:25:51.463 に答える
4

@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))
于 2012-08-16T18:21:09.623 に答える