を指すように自己参照外部キー:管理者ページ許可しないDjangoの自己オブジェクト
idol = models.ForeignKey("self", on_delete=models.CASADE)
は私が同じオブジェクトIDを選択することができます。どのように私はdjango管理フォームを表示することを防ぐことができますか?
を指すように自己参照外部キー:管理者ページ許可しないDjangoの自己オブジェクト
idol = models.ForeignKey("self", on_delete=models.CASADE)
は私が同じオブジェクトIDを選択することができます。どのように私はdjango管理フォームを表示することを防ぐことができますか?
ようになります想像修正が含まれているカスタムフォーム
class ModelAdmin...
form = MyModelForm
に、モデル管理者のためのフォームができ設定する必要がありますあなたのサブクラスModelAdmin
クラスのformfield_for_foreignkey
をオーバーライドしてください。
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)
あなたは、私は、フォームをすることができます。この
class MyModelForm(ModelForm)
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
if self.instance.pk:
query = self.fields['my_field'].queryset
self.fields['my_field'].queryset = query.exclude(id=self.instance.id)
あなたは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)