3

django adminで、タグによるカスタムフィルターを設定したかった(タグはdjango-taggingで導入されます)

このためにModelAdminを作成しましたが、カスタムurlconfを追加し、チェンジリストビューを変更することで、以前は正常に機能していました。次のようなURLで機能するはずです:http://127.0.0.1 :8000 / admin / reviews / review / only-tagged-vista /

しかし、今では、ベース10のint()の無効なリテラルを取得します:'only-tagged-vista'、これは、カスタムフィルターページではなくレビュー編集ページと一致し続けることを意味するエラーです。動作し、これに影響を与えた可能性のある変更を見つけることができません。

助けていただければ幸いです。

関連コード:

class ReviewAdmin(VersionAdmin):

    def changelist_view(self, request, extra_context=None, **kwargs): 
        from django.contrib.admin.views.main import ChangeList 
        cl = ChangeList(request, self.model, list(self.list_display), 
                        self.list_display_links, self.list_filter, 
                        self.date_hierarchy, self.search_fields,  
                        self.list_select_related, 
                        self.list_per_page, 
                        self.list_editable, 
                        self) 
        cl.formset = None

        if extra_context is None: 
            extra_context = {}

        if kwargs.get('only_tagged'): 
            tag = kwargs.get('tag')
            cl.result_list = cl.result_list.filter(tags__icontains=tag) 
            extra_context['extra_filter'] = "Only tagged %s" % tag

        extra_context['cl'] = cl
        return super(ReviewAdmin, self).changelist_view(request, extra_context=extra_context)

    def get_urls(self): 
        from django.conf.urls.defaults import patterns, url 
        urls = super(ReviewAdmin, self).get_urls()

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

        info = self.model._meta.app_label, self.model._meta.module_name 
        my_urls = patterns('', 
                # make edit work from tagged filter list view
                # redirect to normal edit view
                url(r'^only-tagged-\w+/(?P<id>.+)/$',
                    redirect_to,
                    {'url': "/admin/"+self.model._meta.app_label+"/"+self.model._meta.module_name+"/%(id)s"}
                    ),
                # tagged filter list view
                url(r'^only-tagged-(P<tag>\w+)/$',  
                    self.admin_site.admin_view(self.changelist_view), 
                     {'only_tagged':True}, name="changelist_view"), 
        ) 

        return my_urls + urls

編集:元の問題が修正されました。

「スライスが取得されると、クエリをフィルタリングできません」というメッセージが表示されます。行の場合:

cl.result_list = cl.result_list.filter(tags__icontains=tag)

タグフィルターを適用する前に、この結果リストがどこでスライスされるかわかりません。

Edit2:ChangeList宣言のself.list_per_pageが原因です。しかし、まだ適切な解決策を見つけられませんでした。一時的な修正:

        if kwargs.get('only_tagged'):
            list_per_page = 1000000
        else:
            list_per_page = self.list_per_page 
        cl = ChangeList(request, self.model, list(self.list_display), 
                        self.list_display_links, self.list_filter, 
                        self.date_hierarchy, self.search_fields,  
                        self.list_select_related, 
                        list_per_page, 
                        self.list_editable, 
                        self) 
4

3 に答える 3

4

P in の前に疑問符 in'^only-tagged-(P<tag>\w+)/$'がないため、式が一致しません。

于 2009-10-06T10:10:08.053 に答える
0

一致する単語タグが1つだけであるため、複数単語タグでエラーが発生します。これは機能します:r'^ only-tagged-(?P [^ /] +)/ $'

于 2010-03-21T02:39:39.713 に答える
0

上記のコード例では、get_urls() は ReviewAdmin クラスの一部ではなく、別の関数になるように調整されています。実際のソースで同じようにすると、問題が発生する可能性があると思います。

于 2009-10-06T09:27:05.930 に答える