【问题标题】:How to change how disabled dropdown in form is rendered如何更改表单中禁用的下拉菜单的呈现方式
【发布时间】:2018-02-11 10:23:00
【问题描述】:

我有 2 个表格,第一个表格有一个下拉菜单,让用户可以选择司机:Bob、Jim、Jack.... 假设用户选择 Bob 并保存。

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

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

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

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

【问题讨论】:

  • 我不太明白,您是要删除该下拉菜单并在视图中假定值还是像标签一样在模板中显示?
  • 将值显示为标签是可以接受的,因为不允许编辑。实际上,能够在表单上显示来自其他模型行的数据也会很有用。例如,每条路线都有一个目标停靠点数。我希望能够显示基于计划停止/目标停止 * 100 的百分比。我认为这是相同的要求。
  • 好吧,我不知道,但是发布您的视图和模板

标签: django django-forms django-templates


【解决方案1】:

正如您在 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.xml 中执行此操作。在您看来,获取 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',
            ...

【讨论】:

  • 谢谢。这很好用,但由于另一个要求,它不能完全满足我的需求。在我的例子中,初始字段值('驱动程序的名称')会有所不同,具体取决于登录用户的名称。如何将登录的user_id传入?
猜你喜欢
  • 2021-10-22
  • 2013-11-24
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多