2016-11-24 9 views
4

を指すように自己参照外部キー:管理者ページ許可しないDjangoの自己オブジェクト

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

は私が同じオブジェクトIDを選択することができます。どのように私はdjango管理フォームを表示することを防ぐことができますか?

答えて

4

ようになります想像修正が含まれているカスタムフォーム

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) 
2

あなたは、私は、フォームをすることができます。この

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) 
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)   
関連する問題