【问题标题】:Can't disable select in ModelForm无法在 ModelForm 中禁用选择
【发布时间】:2013-07-27 19:09:05
【问题描述】:

在我的 ModelForm 中,我需要禁用 ForeignKey 字段。我尝试了this thing,但仍然启用了选择,正如我在 html 代码中看到的那样,属性没有添加到小部件中。这是我的代码 ModelForm 代码:​​

class ZayvkiAdminForm(ModelForm):
    class Meta:
        model = Zayvki
    def __init__(self, *args, **kwargs):
        if not kwargs.get('instance', None):
            if not kwargs.get('initial', None):
                kwargs['initial'] = {}
            if not kwargs['initial'].get('nomer_zayvki', None):
                kwargs['initial']['nomer_zayvki'] = get_request_number()
        super(ZayvkiAdminForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['tipe_zayvki'].required = False
            self.fields['tipe_zayvki'].widget.attrs['disabled'] = 'disabled'
            self.fields['nomer_zayvki'].widget.attrs['readonly'] = True

更新: 我不能使用exclude 或readonly attrs of ModelAdmin,因为我需要用户能够在创建对象时添加一些东西。但是当创建对象时,我不希望用户只是查看值而不是对其进行编辑。

【问题讨论】:

  • 你能贴出你的 ModelForm 的全部代码吗?
  • 我已经更新了问题。
  • 嗯,我看不出你的代码有什么问题。您是否使用./manage.py runserver 来运行您的服务器?如果是这样,请尝试在 instance = getattr(self, 'instance', None) 之后添加行 print instance。当您打开编辑页面时,您应该在运行服务器的控制台中看到一些输出,位于其他调试语句之间。你能告诉我你看到了什么吗?
  • 在实例变量中当然有我的模型对象。当我调试脚本时,我可以看到附加到小部件的属性“已禁用”,所以我不知道为什么它不起作用。
  • 你能把代码贴在你的 admins.py 中吗?我在自己的应用程序中添加动态禁用字段没有问题。另外,您使用的是哪个 Django 版本?

标签: django django-admin


【解决方案1】:

MoedlAdmin 可以是解决方案:

class CustomAdmin(admin.ModelAdmin):
    readonly_fields = ('tipe_zayvki',)

还有一个名为get_readonly_fields的方法这里是一个例子:

class CustomAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['tipe_zayvki']
        else:
            return []

【讨论】:

  • 表单行为应该更复杂。我已经更新了这个问题。请看一看。
【解决方案2】:

尝试指定exclude,如Django docs 中所述。这将删除表单中呈现的字段,这比禁用的表单输入字段更清晰的用户体验。

所以对于你的例子:

class MyModelForm(ModelForm):
    class Meta:
        exclude = ('tipe_zayvki', )

【讨论】:

  • 这不是一个选项,因为尽管用户无法编辑他肯定需要查看的值。
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 2011-05-30
  • 2015-03-20
  • 2018-11-23
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多