我的表单中有一个外键字段,初始化为:
form=myform(intial= {'val':abc.objects.get(pk=id)})
我已经单独尝试了以下一组代码,使字段“val”成为只读值。
form.fields['val'].widget = forms.HiddenInput()
form.fields['val'].widget.attrs['readonly'] = True
form.fields['val'].widget.attrs['disabled'] = True
form.fields['val'].widget.attrs['disabled'] = 'disabled'
form.fields['val'].widget.attrs['disabled'] = False
form.fields['val'].widget.attrs['display_only'] = True
form.fields['val'].widget.attrs['editable'] = False
仅HiddenInput
有效,但未在表单中显示该字段,而disabled
显示错误。 readonly
在除外键字段之外的所有字段上工作。
答案 0 :(得分:1)
我通过覆盖Select小部件渲染方法并更改其输出来完成此操作。
class ReadOnlySelect(Select):
"""
This should replace the Select widget with a disabled text widget displaying the value,
and hidden field with the actual id
"""
def render(self, name, value, attrs=None, choices=()):
final_attrs = self.build_attrs(attrs, name=name)
display = "None"
for option_value, option_label in chain(self.choices, choices):
if str(option_value) == (value) :
display = option_label
output = format_html('<input type=text value="%s" disabled="disabled" ><input type="hidden" value="%s" %s> ' % (display, value, flatatt(final_attrs)))
return mark_safe(output)
关于Django片段的更全面的例子。 https://djangosnippets.org/snippets/10436/
答案 1 :(得分:0)
我有类似的问题,我决定使用不同的方法。首先,我为表单定义自己的类,例如:
class MyForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
class Meta:
model = YourModel
exclude = ('foreign_key_field')
然后在模特中myModel做到了这样:
foreign_key_field = models.ForeignKey(KeyField)
def set_values(self, *args, **kwargs):
foreign_key_field = kwargs.pop('foreign_key_field')
我定义函数来设置只读字段值。我称这种方法 在views.py中创建表单对象后。 (提交表格后)
最后是views.py:
if form.is_valid():
new_instance = form.save(commit=False)
new_instance.set_values(
foreign_key_field='YOUR VALUE',
)
new_instance.save()
我从表单中排除了这些字段,但在创建实例后我正在设置值。设置值后,我保存到db。