15

ページの追加と変更には別々のビューが必要です。追加ページで、インラインフォームセットから一部のフィールドを除外したいと思います。2つのTabularInlineクラスを用意しましたが、そのうちの1つにはプロパティ'exclude'が含まれています。私はそれらを次のように使用しようとしました:

class BoxAdmin(admin.ModelAdmin):
    def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        return super(BoxAdmin, self).change_view(self.request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        return super(BoxAdmin, self).add_view(self, request)

効果なし(インラインはまったく表示されません)。

4

6 に答える 6

21

Django 1.5+で動作し、上品でエレガントに見えます:

// admin.py
class BoxAdmin(ModelAdmin):

    inlines = ()

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inlines = (ItemChangeInline, )
        return super(BoxAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.inlines = (ItemAddInline, )
        return super(BoxAdmin, self).add_view(request)

誰にとっても役立つことを願っています

于 2013-05-24T11:21:58.210 に答える
7

動作しているように見えるコードは次のとおりです。

class BoxAdmin(admin.ModelAdmin):
   def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).change_view(request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).add_view(request)

ただし、これはエレガントに見えないため、次の部分が発生します。

            for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)

admin.ModelAdminのinitメソッドからのコピーアンドペーストです(したがって、2回実行されます)。

于 2010-02-10T10:24:38.693 に答える
1

add_view に.add_view(self, request)あり、 change ビューにあるのはなぜ.change_view(self.request, ..)ですか? super を使用しているため、add_view に self は必要ないと思います。

于 2010-02-10T09:25:00.293 に答える
0

特定のストーリーの管理サイトに基づいて、インラインを表示する必要がある状況がありました。

alekwisnia の回答を拡張すると、次のコードを使用して Django 1.3 で動作する動的インラインを取得できました。

ハイライト/admin.py

class HighlightInline(generic.GenericTabularInline):
    model = Highlight
    extra = 1
    max_num = 4
    fields = ('order', 'highlight')
    template = 'admin/highlights/inline.html'

class HighlightAdmin(admin.ModelAdmin):
    def regulate_highlight_inlines(self):
        highlights_enabled = Setting.objects.get_or_default('highlights_enabled', default='')
        highlight_inline_instance = HighlightInline(self.model, self.admin_site)
        highlight_found = any(isinstance(x, HighlightInline) for x in self.inline_instances)
        if highlights_enabled.strip().lower() == 'true':
            if not highlight_found:
                self.inline_instances.insert(0, highlight_inline_instance)
        else:
            if highlight_found:
                self.inline_instances.pop(0)
        print self.inline_instances

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.regulate_highlight_inlines()
        return super(HighlightAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.regulate_highlight_inlines()   
        return super(HighlightAdmin, self).add_view(request, form_url, extra_context)

story/admin.py 内

class StoryAdmin(HighlightAdmin):

注意すべきことの 1 つは、インライン クラス (HighlightInline) を操作しているだけでなく、インライン インスタンス (HighlightInline(self.model, self.admin_site)) を変更していることです。これは、django が admin クラスの最初の構築中に、インライン クラスのリストに基づいてインライン インスタンスのリストをすでに構築しているためです。

于 2014-06-15T14:27:08.763 に答える
0

Django 1.3 の別の解決策

class BoxAdmin(admin.ModelAdmin):

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inline_instances = [ItemChangeInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).change_view(request, object_id, extra_context)

    def add_view(self, request, form_url='', extra_context=None):
        self.inline_instances = [ItemAddInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).add_view(request, form_url, extra_context)
于 2016-03-29T14:08:06.620 に答える