Django管理员禁用外键下拉,但保持旁边的添加按钮

时间:2017-12-21 13:33:11

标签: django python-3.x django-admin

我有一个下拉状态:

enter image description here

我希望禁用某个特定的外键,但需要" plus"按钮完好无损因此,在管理员中,用户只能添加值,但无法编辑或从列表中选择。

我想要像 add_only

2 个答案:

答案 0 :(得分:1)

您可以使用Django的管理员选项来允许您查看/编辑/删除哪些模型字段:ModelAdmin Options

我相信你可以使用list_editable字段:

class MyModelAdmin(OrderedModelAdmin):
    list_display = ('foo_editable', 'bar_editable', 'publisher')
    list_editable = ['foo_editable',  'bar_editable',]

    def get_readonly_fields(self, request, obj=None):
        if obj:
            # obj is not None, so this is an edit
            return ['publisher',] # Return a list or tuple of readonly fields' names
        else: 
            # This is an addition
            return []

admin.site.register(MyModel, MyModelAdmin)

答案 1 :(得分:1)

我遇到了类似的问题——相关字段的下拉列表有太多的值,导致管理编辑页面加载异常缓慢(有时会导致超时)。但我仍然需要能够对外键字段进行操作。

您既可以禁用下拉菜单,也可以使用模型表单删除编辑按钮。

  • 将外键字段设置为禁用。这将阻止它被填充,并阻止用户从下拉菜单中手动选择。
  • 将外键字段的小部件设置为 can_change_related = False。这将删除编辑按钮。

代码如下:

class ModelA(models.Model):
    pass

class ModelB(models.Model):
    a_ref = models.ForeignKey(ModelA)

class ModelBAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['a_ref'].disabled = True
        self.fields['a_ref'].widget.can_change_related = False

    class Meta:
        model = ModelB
        fields = '__all__'

class ModelBAdmin(admin.ModelAdmin):
    form = ModelBAdminForm

您还可以使用 can_create_related = False

禁用创建按钮

而且,您可以通过使用 self.fields['a_ref'].queryset = ModelB.obejcts.filter(...)

优化查询来减小下拉列表的大小