【问题标题】:Django - get value of readonly field (fix readonly error)Django - 获取只读字段的值(修复只读错误)
【发布时间】:2018-05-03 11:54:57
【问题描述】:

我正在尝试编辑 fieldset.html 模板,以便在只读 div 下添加隐藏输入(在只读情况下)。

{% if field.is_readonly %}
  <div class="readonly {% if field.field.name %} field-{{ field.field.name }}{% endif %}">{{ field.contents }}</div>
  <input id="{% if field.field.name %} id-{{ field.field.name }}{% endif %}" type="hidden" value="{{ field.field.initial }}"/>
{% else %}
  {{ field.field }}
{% endif %}

我的问题是,如果我使用“get_readonly_fields”设置只读字段,我无法提交表单,因为需要隐藏字段(我认为这是使用 div 而不是隐藏输入的 django 的一个大错误)。

我尝试使用上面的代码修复它,但我无法将值插入到我的字段中,因为“field.field.initial”对于只读字段是空的。我该如何解决?

更新

我的form.py:

class MyModelAdminForm(forms.ModelForm):
  val1 = forms.CharField()
  val2 = forms.ModelChoiceField(queryset=User.objects.filter(groups__name='Group1'))
  val3 = forms.CharField(widget=forms.DateInput(attrs={'type': 'date'}))

  class Meta: 
    model  = MyModel
    fields = ('val1', 'val2', 'val3')

  def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs)
    for field in self._meta.fields:
        attrs = {'class':'form-control'}
        self.fields[field].widget.attrs.update(attrs)

我的管理员.py

class CampaignAdmin(admin.ModelAdmin):

  def get_form(self, request, obj=None, **kwargs):
    return MyModelAdminForm

  def get_fieldsets(self, request, obj=None):
    return [
      (None,           {'fields': ['val1', 'val2']}),
      ('Informations', {'fields': ['val3']}),
    ]

  def get_readonly_fields(self, request, obj=None):
    if obj:
      return self.readonly_fields + ('val2',)
    else:
      return self.readonly_fields

我需要 val2 在编辑页面中处于只读模式。

【问题讨论】:

    标签: django django-forms django-templates


    【解决方案1】:

    一般来说,您可以在表单中添加您认为合适的任何字段。因此,如果您需要该字段显示为只读字段以及隐藏字段,您只需添加两个字段即可。您应该正确命名隐藏字段,以便保存工作。您可以使用label更改只读字段的标签(https://docs.djangoproject.com/en/1.11/ref/forms/fields/#label)。

    编辑 - 您的代码的解决方案:

    对于您的解决方案,如果您将表单更改为将 val2 作为只读字段而不是常规字段,您还需要将表单的 Meta.fields 设置更改为:

    fields = ('val1', 'val2', 'val3')
    

    fields = ('val1', 'val3')
    

    否则,val2 的验证器将运行。

    或者,您必须将val2 的小部件更改为HiddenInput,并将其值添加为readonly_field,在您的django 管理类中使用不同的名称和显式方法。但这需要根据模式(编辑或创建)更改字段集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2012-07-04
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多