【问题标题】:Make django modelchoicefield readonly true使 django modelchoicefield 只读为 true
【发布时间】:2017-02-08 17:42:38
【问题描述】:

在我的编辑页面上,我试图允许用户编辑/更改他们输入的内容,但有一个条件是他们无法编辑 Modelchoice 字段。

所以,我尝试了这个命令,但它不起作用。使用 "readonly=True" 用户仍然可以更改模型选择字段“下拉文件”,而使用 "disabled = True" 用户不能更改模型选择字段但是当他们尝试提交时他们收到此错误:“此字段是必需的。”

myform.py

class NameForm(forms.ModelForm):
    class Meta:
         model=Name
         fields = '__all__'

    def __init__(self, *args, **kwargs):
         super(NameForm, self).__init__(*args, **kwargs)
         self.fields['names'].widget.attrs['disabled'] = 'True'
         #self.fields['names'].widget.attrs['readonly'] = True

任何有解决方案的人..?

提前致谢

【问题讨论】:

  • 设置disabledreadonly 只会改变小部件在html 中的呈现方式。它不会阻止用户提交不同的值。如果您不想编辑某个字段,则应通过设置fieldsexclude 从表单中删除该字段。
  • 感谢您@Alasdair 的建议,但我希望用户能够看到该字段但无法编辑/更改它。
  • 如果你使用 Django 管理员,你可以使用readonly_field。如果您使用自己的视图和模板,只需在模板中包含 {{ instance.field }} 即可显示值。
  • 如果你必须显示一个表单域,那么你必须在表单/视图中做一些事情来防止值被保存。您可以查看用户如何更改表单 prevents the password from being changed 以获得灵感。如果禁用小部件,则必须设置 required=False 以防止出现之前的错误。

标签: jquery django


【解决方案1】:

我在我们的项目中也遇到了类似的情况并修复了它。因此,您可以尝试通过以下方式解决您的问题:

class NameForm(forms.ModelForm):
    class Meta:
         model=Name
         fields = '__all__'

    def __init__(self, *args, **kwargs):
         super(NameForm, self).__init__(*args, **kwargs)       
         instance = getattr(self, 'instance', None)

         # When in EDIT mode.
         if instance and instance.id:
             self.fields['names'].widget.attrs['disabled'] = 'True'
             self.fields['names'].required = 'False'

    def clean_event(self):
        instance = getattr(self, 'instance', None)

        # `disabled` field will have no form data,
        # so we just use the previously saved value.
        if instance and instance.pk:
            return instance.names
        else:
            # When in CREATE mode.
            return self.cleaned_data['names']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2014-04-29
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多