【问题标题】:"Simple Dynamic" Dropdown menu in django formdjango 形式的“简单动态”下拉菜单
【发布时间】:2020-05-26 01:46:00
【问题描述】:

首先,我对 django 很陌生... 我正在尝试在表单中添加可用不同用户的下拉菜单(按名称并来自我的数据库“动态”)。

我正在使用 django 2.2.6。

# MyCustomForm
class DetailedReportForm(forms.Form):
    AVAILABLE_USERS = MyUserModel.objects.order_by().values_list('name').distinct()
    selected_date = forms.DateTimeField(input_formats=['%d/%m/%Y'], required=True, widget=DateInput())
    selected_user = forms.CharField(label="Select a user", widget=forms.Select(choices=AVAILABLE_USERS))

# MyModel
class MyUserModel(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    name = models.CharField(db_column='Name', unique=True, max_length=90)
    ...
    def __str__(self):
        return str(self.name)

我面临的问题是我的查询集不工作(不知道为什么),因为它给了我以下信息:not enough values to unpack (expected 2, got 1)

我试图用谷歌搜索它,但我仍然不太清楚这条错误消息的含义。

有人可以解释一下这个 django 错误是什么意思,以便我修复它并将下拉列表包含在我的表单中吗?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    问题是choices 参数需要这样的元组列表:[(1, "one"), (2, "two")]。元组实际值中存储在数据库中的第一个元素,第二个是人类可读的表示。

    但实际上在您的情况下,您可以改用ModelChoiceField

    class DetailedReportForm(forms.Form):
        AVAILABLE_USERS = MyUserModel.objects.order_by().values_list('name').distinct()
        selected_date = forms.DateTimeField(input_formats=['%d/%m/%Y'], required=True, widget=DateInput())
        selected_user = forms.ModelChoiceField(label="Select a user", queryset=MyUserModel.objects.order_by().distinct("name"))
    

    否则可用选项列表不会动态更新,因为表单类中的代码在 django 启动时只运行一次。

    【讨论】:

    • 出于某种原因,感谢您的回答。当后端是 MySQL 时,我无法区分字段。所以我不得不替换你的dictinct("name") 来区分()here
    • @WilliamW 是的,不幸的是,字段不同,现在只能在 PostgreSQL 上工作。
    猜你喜欢
    • 2020-09-27
    • 2013-11-05
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多