我正在尝试编辑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在编辑页面中处于只读模式。
答案 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
。但这需要根据模式(编辑或创建)更改字段集。