2

我的表单中有一个外键字段,初始化为:

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工作于除外键字段之外的所有字段。

4

2 回答 2

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/

于 2014-12-10T17:52:23.597 回答
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.

于 2012-10-15T20:22:51.420 回答