Python 具有只读属性的Django模型表单
首先让我解释一下这个场景:我在一个CRUD中工作,Django 1.8.7、Python 2.7和bootstrap作为前端。在这个CRUD列表中,当用户按下Add按钮时,将打开一个模式,其中包含一个组合框,供用户选择要创建的项目类型。用户选择该选项,然后动态加载下一个表单。到目前为止,它工作得很好。我的问题是:用户在列表中选择的组合是此表单的字段之一,无法更改此字段。它的形式必须与文本一样 示例: 现行表格: 当Url为:domain.com/adm/products/add时,表单应该是什么?category_id=2 在querystring上传递category_id时,我不希望允许用户编辑此值 我的问题是:我如何才能做到这一点?我使用CreateView作为视图,使用ModelForm作为表单Python 具有只读属性的Django模型表单,python,django,forms,Python,Django,Forms,首先让我解释一下这个场景:我在一个CRUD中工作,Django 1.8.7、Python 2.7和bootstrap作为前端。在这个CRUD列表中,当用户按下Add按钮时,将打开一个模式,其中包含一个组合框,供用户选择要创建的项目类型。用户选择该选项,然后动态加载下一个表单。到目前为止,它工作得很好。我的问题是:用户在列表中选择的组合是此表单的字段之一,无法更改此字段。它的形式必须与文本一样 示例: 现行表格: 当Url为:domain.com/adm/products/add时,表单应该是什
提前感谢您提供的任何提示只需在meta之前再次定义该字段即可
class MyForm(ModelForm):
inp_type = forms.CharField(widget = forms.TextInput(attrs={'readonly':'readonly'}))
class meta:
model = MyModel
exclude = ['id']
只需在meta之前再次定义字段
class MyForm(ModelForm):
inp_type = forms.CharField(widget = forms.TextInput(attrs={'readonly':'readonly'}))
class meta:
model = MyModel
exclude = ['id']
我找到路了。首先,您必须创建一个自定义小部件,它将以您想要的方式呈现。在我的例子中,最初的小部件是一个组合(选择),因此我发现这个小部件:
class ReadOnlySelect(Select):
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 utf8_encode(option_value) == utf8_encode(value):
display = option_label
output = format_html('<p>%s</p><input type="hidden" value="%s" %s> ' % (display, value, flatatt(final_attrs)))
return mark_safe(output)
第三步,设置要在字段中使用的小部件:
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ['category','title' ]
widgets = {
'category': ReadOnlySelect(),
}
然后,当django加载表单时,该字段将显示为一个文本,后跟一个隐藏的输入。我找到了方法。首先,您必须创建一个自定义小部件,它将以您想要的方式呈现。在我的例子中,最初的小部件是一个组合(选择),因此我发现这个小部件:
class ReadOnlySelect(Select):
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 utf8_encode(option_value) == utf8_encode(value):
display = option_label
output = format_html('<p>%s</p><input type="hidden" value="%s" %s> ' % (display, value, flatatt(final_attrs)))
return mark_safe(output)
第三步,设置要在字段中使用的小部件:
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ['category','title' ]
widgets = {
'category': ReadOnlySelect(),
}
然后,当django加载表单时,该字段将显示为一个文本,后面是一个隐藏的输入。您的问题不清楚,请澄清以下内容:“用户选择选项”。。这是您试图设置为只读的选项吗?。这个引用的文本是否准确“.下一个表单是动态加载的”或者应该是“.下一个表单元素是动态加载的”。让我随便猜一猜,-您是指根据用户在模态框中的初始选择动态加载的“表单元素值”吗,是否应该以信息文本输出的形式呈现?@BobbyC我已经用显示我想要实现的目标的图像更新了问题。不清楚您的问题是什么。请澄清以下内容:“用户选择选项”。。这是您试图设置为只读的选项吗?。这个引用的文本是否准确“.下一个表单是动态加载的”或者应该是“.下一个表单元素是动态加载的”。让我随便猜一猜,-你是说根据用户在模式框中所做的初始选择动态加载的“表单元素值”真的应该显示为信息文本输出吗?@BobbyC我已经用显示我想要实现的内容的图像更新了这个问题。似乎这个解决方案不完整,那么使用
inp\u类型
怎么办?这个解决方案似乎不完整,那么使用inp\u类型
怎么办?