簡體   English   中英

禁止Django自引用外鍵指向自我對象

[英]Disallow Django self-referential foreign key to point to self object

我有一個常規的自我引用外鍵:

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

管理頁面允許我選擇相同的對象ID。 如何阻止django管理員表單顯示?

您可以在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 ModelAdmin...
    form = MyModelForm

我想這個表格看起來像這樣

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)         

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM