Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有只读属性的Django模型表单_Python_Django_Forms - Fatal编程技术网

Python 具有只读属性的Django模型表单

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时,表单应该是什

首先让我解释一下这个场景:我在一个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作为表单


提前感谢您提供的任何提示

只需在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类型
怎么办?