4

モデル管理者に 2 つの URL を追加しようとしています。

class JobTitleAdmin(admin.ModelAdmin):
    inlines = [OccupationTagInline, ]
    model = JobTitle
    search_fields = ['title',]
    list_filter = ['status',]
    actions =['add_to_job_category', 'move_to_job_category' ]

    def add_to_job_category_view(self, request):

        return render_to_response(
            'admin/job_title/select_job_category.html',
            {
                'action': 'add',
                'featured_occupations': Occupation.objects.filter(featured=True),
                'title_ids': array(request.GET['foo'])
                },
            context_instance=RequestContext(request)
            )

    def get_urls(self):
        urls = super(JobTitleAdmin, self).get_urls()
        custom_urls = patterns('',
            url(r'^add_to_job_category/$', self.admin_site.admin_view(self.add_to_job_category_view), name='admin_jobtitle_add_to_cat',),
            url(r'^move_to_job_category/$', self.admin_site.admin_view(self.move_to_job_category_view), name='admin_jobtitle_move_to_cat',)
    )

        return custom_urls + urls

簡単にするために、ビューのコードは省略しました。

これらの 2 つのパターンは、アクセスしようとすると 404 が返されるため定義されておらず、django debud 404 ページにリストされていません。それでも、メソッド get_urls は適切に呼び出されます (実際には 2 回、理由はわかりません)。

何が間違っている可能性がありますか?

4

2 に答える 2

2

これは成功しましたが、ModelAdmin.get_urls wrapデコレータをコピーしました。多分試してください:

from functools import update_wrapper
class JobTitleAdmin(admin.ModelAdmin):
    inlines = [OccupationTagInline, ]
    model = JobTitle
    search_fields = ['title',]
    list_filter = ['status',]
    actions =['add_to_job_category', 'move_to_job_category' ]

    def add_to_job_category_view(self, request):

        return render_to_response(
            'admin/job_title/select_job_category.html',
            {
                'action': 'add',
                'featured_occupations': Occupation.objects.filter(featured=True),
                'title_ids': array(request.GET['foo'])
                },
            context_instance=RequestContext(request)
            )

    def get_urls(self):
        urls = super(JobTitleAdmin, self).get_urls()

        def wrap(view):
            def wrapper(*args, **kwargs):
                return self.admin_site.admin_view(view)(*args, **kwargs)
            return update_wrapper(wrapper, view)

        custom_urls = patterns('',
            url(r'^add_to_job_category/$',
                 wrap(self.add_to_job_category_view),
                 name='admin_jobtitle_add_to_cat',),
            url(r'^move_to_job_category/$',
                 wrap(self.move_to_job_category_view),
                 name='admin_jobtitle_move_to_cat',)
        )

        return custom_urls + urls
于 2013-03-07T03:37:05.357 に答える
0

コードから、いくつかのアクション中間ビューModelAdminクラスに追加しようとしているように見えます。

actionsこれは、関数名を属性に入れることによって実現されます。カスタム アクションを追加するだけの場合は、カスタム URL を追加する必要はありません。あなたの例は次のように変更できます:

class JobTitleAdmin(admin.ModelAdmin):
    inlines = [OccupationTagInline, ]
    model = JobTitle
    search_fields = ['title',]
    list_filter = ['status',]
    actions =['add_to_job_category', 'move_to_job_category' ]

    def add_to_job_category(self, request, queryset):

        return render_to_response(
            'admin/job_title/select_job_category.html',
            {
                'action': 'add',
                'featured_occupations': Occupation.objects.filter(featured=True),
                'title_ids': array(request.GET['foo'])  # <-- this would probably be changed to use `queryset` function argument
                },
            context_instance=RequestContext(request)
            )
    add_to_job_category.short_description = "Add to job category"

クラスは、ModelAdminカスタム関数を呼び出してアクションをアクション ドロップダウンに追加する方法を認識します。中間応答ビューadd_to_job_categoryは、どの項目が選択されたかを判別するために、アクションから入力を取得する方法を知る必要があります。

カスタム URL を本当に追加したい場合、get_urls()関数は正しいようです。によって返される URL はget_urlsadmin/<app>/<model>.

アプリの名前がmyappモデルである場合、ビューJobTitleにヒットする URL は次のようになります。add_to_job_category

http://some.site/admin/myapp/jobtitle/add_to_job_category/
于 2013-03-06T00:43:33.793 に答える