【问题标题】:Django Model form with read only properties具有只读属性的 Django 模型表单
【发布时间】:2016-06-02 04:32:18
【问题描述】:

首先让我解释一下这个场景:我正在使用 Django 1.8.7、Python 2.7 和 bootstrap 作为前端的 CRUD。在该 CRUD 的列表中,当用户按下添加按钮时,将打开一个带有组合的模式,供用户选择他想要创建的项目类型。用户选择该选项并动态加载下一个表单。到目前为止,它工作得很好。我的问题是:用户在列表中选择的组合是此表单的字段之一,此字段无法更改。它的形式必须与文本一样。

例子:

当前形式:

Url 为 : domain.com/adm/products/add?category_id=2 时的表单应该是什么

当 category_id 在查询字符串上传递时,我不想让用户编辑这个值。

我的问题是:我怎样才能做到这一点?我将 CreateView 用于视图,将 ModelForm 用于表单。

提前感谢任何提示

【问题讨论】:

  • 不清楚你的问题是什么
  • 请澄清以下内容:“用户选择选项”..这是您尝试只读的选项吗?这个引用的文本是否准确“.. 并且下一个表单是动态加载的”或者应该是“...并且下一个表单 ELEMENT 是动态加载的”。让我大胆猜测一下,-您的意思是根据用户在模态框中所做的初始选择动态加载的“表单元素值”,真的应该作为信息性文本输出呈现吗?
  • @BobbyC 我已经用显示我想要实现的目标的图像更新了问题。

标签: python django forms


【解决方案1】:

只需在 meta 之前再次定义该字段。

class MyForm(ModelForm):
    inp_type = forms.CharField(widget = forms.TextInput(attrs={'readonly':'readonly'}))
    class meta:
        model = MyModel
        exclude = ['id']

【讨论】:

  • 看来这个解决方案是不完整的,那你怎么处理inp_type
【解决方案2】:

我找到了方法。首先,您必须创建一个自定义小部件,以您想要的方式呈现。在我的情况下,原始小部件是一个组合(选择),所以我找到了这个小部件:

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)

第二步你必须设置字段的默认值,在 CreateView 中覆盖 get_initial 方法:

def get_initial(self):        
    category = None        
    if self.request.method == "GET" :
        # this method sets the initial value for the fields               
        try:
            category = Category.objects.get(pk=self.request.GET.get('category_id'))
        except Category.DoesNotExist:
            raise Http404(_(u"Destination not found."))

    return {'category': category}

第三步你设置要在字段中使用的小部件:

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ['category','title' ]
        widgets = {
            'category': ReadOnlySelect(),
        }

然后当 django 加载表单时,该字段将显示为文本,后跟隐藏输入。

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2015-11-21
    • 2011-12-09
    • 2021-10-31
    • 1970-01-01
    • 2011-01-30
    • 2013-12-12
    • 2014-03-30
    相关资源
    最近更新 更多