如何更改表单中禁用下拉列表的方式

时间:2017-09-02 16:09:23

标签: django django-forms django-templates

我有2个表单,第一个表单有一个下拉菜单,允许用户使用驱动程序:Bob,Jim,Jack ....假设用户选择Bob并保存。

class RouteUpdate(forms.ModelForm):
class Meta:
    model= Route
    fields= [
        'route',
        'driver',
        ...

在第二种形式中,我需要显示Bob,但该字段不能编辑。 Readonly不是一个选项,因为这允许查看(如果不是选择)其他选项。

禁用该字段有效,但仍会将其呈现为下拉列表(已禁用)。

enter image description here

有关如何解决此问题的任何建议。如果只是简单的方法,我会很高兴 渲染" Bob作为模板中的变量而不是表单字段。或者,我如何格式化该字段?感谢。

1 个答案:

答案 0 :(得分:0)

正如你在Field文档中看到的那样,你可以做你想做的事:

在您的情况下,您可以在课程中添加一个字段

class RouteUpdate(forms.ModelForm):

    the_driver = forms.CharField(required=False, label='The Driver', disabled=True)

    def __init__(self, *args, **kwargs):
        super(RouteUpdate, self).__init__(*args, **kwargs)

        # here you can decide the name of your driver based on other fields/model
        self.fields['the_driver'].initial = 'The name of the driver'

    class Meta:
        model= Route
        fields= [
            'route',
            ...

如果需要将值传递给表单以构造驱动程序的名称,则可以在init上执行此操作。在您的视图中,获取request.user并从中获取名称并将其传递

class RouteUpdate(forms.ModelForm):

    the_driver = forms.CharField(required=False, label='The Driver', disabled=True)

    def __init__(self, username=None, *args, **kwargs):
        # the super is called without username
        super(RouteUpdate, self).__init__(*args, **kwargs)

        username = username or 'default name'
        self.fields['the_driver'].initial = username

    class Meta:
        model= Route
        fields= [
            'route',
            ...