Django - 获取readonly字段的值(修复readonly错误)

时间:2017-11-20 09:46:22

标签: django django-forms django-templates

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

{% 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”设置一个readonly字段,我就无法提交表单,因为需要隐藏字段(我认为这是使用div而不是隐藏输入的django的一个大错误)。

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

更新

我的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)

我的admin.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在编辑页面中处于只读模式。

1 个答案:

答案 0 :(得分:0)

通常,您可以根据需要向表单添加任何字段。因此,如果您需要将字段显示为只读字段以及隐藏字段,则只需添加两个字段即可。您应该正确命名隐藏字段,以便保存工作。您可以使用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,并使用django管理类中使用显式方法的其他名称将其值添加为readonly_field。但这需要根据模式(编辑或创建)更改字段集。