Python 将初始化的外键字段设置为窗体中的只读字段
我的表单中有一个外键字段,初始化为:Python 将初始化的外键字段设置为窗体中的只读字段,python,django,forms,foreign-keys,readonly,Python,Django,Forms,Foreign Keys,Readonly,我的表单中有一个外键字段,初始化为: 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 f
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处理除外键字段外的所有字段。我有类似的问题,我决定使用不同的方法。首先,我为表单定义了自己的类,例如:
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 我通过覆盖selectwidgets呈现方法并更改其输出来实现这一点
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代码片段的更完整示例。
禁用显示了什么错误?您是否尝试过“.widget.attrs['disabled']='disabled'?您是想在django管理员中还是以自定义形式显示它?谢谢您的帮助。。但是我尝试了widget.attrs['disabled']='disabled'。当我使用disable=true或disable=disableAnd时,表单没有被提交。发生了什么?你犯了什么错误?你似乎已经尝试了所有的可能性。。奇怪的是,它们不适用于美国。表单用于验证输入,但这不是来自用户,无法更改。为什么它需要成为表单的一部分?