Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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 将初始化的外键字段设置为窗体中的只读字段_Python_Django_Forms_Foreign Keys_Readonly - Fatal编程技术网

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时,表单没有被提交。发生了什么?你犯了什么错误?你似乎已经尝试了所有的可能性。。奇怪的是,它们不适用于美国。表单用于验证输入,但这不是来自用户,无法更改。为什么它需要成为表单的一部分?