4

通常の自己参照外部キーがあります。

idol = models.ForeignKey("self", on_delete=models.CASADE)

管理ページでは、同じオブジェクト ID を選択できます。django管理フォームに表示されないようにするにはどうすればよいですか?

4

3 に答える 3

6

formfield_for_foreignkeyクラスのサブクラスでオーバーライドできますModelAdmin

ModelAdmin の formfield_for_foreignkey メソッドを使用すると、外部キー フィールドのデフォルトのフォーム フィールドをオーバーライドできます。

親オブジェクト ID はchange_viewメソッドに保存できます:

class IdolAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.object_id = object_id
        return super(IdolAdmin, self).change_view(
            request, object_id, form_url, extra_context=extra_context,
        )

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "idol":
            kwargs['queryset'] = Idol.objects.exclude(pk=self.object_id)
        return super(IdolAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs)
于 2016-11-24T10:48:34.463 に答える
0

延長できますrender_change_form

class IdolAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
         queryset = context['adminform'].form.fields['idol'].queryset
         original_id = context.get('original', None)
         if(original_id):
             context['adminform'].form.fields['idol'].queryset = queryset.exclude(id=original_id.id)
         return super(IdolAdmin, self).render_change_form(request, context, args, kwargs)         
于 2016-11-24T10:56:37.137 に答える