首页 > 解决方案 > Django 表单从选项中选择或输入新数据

问题描述

我有一个 Django 表单,对于某些字段,我从数据库中提取选项,如下所示。

我有另一个字段,用户必须在其中手动输入数据。是否可以提供数据库中存在的字段选择以及如果不存在选择输入数据的选项?

示例:字段名称是球员,我希望所有球员都已经在数据库中作为可供选择的选项,如果是新球员,则输入它的选项。

这就是 TypedChoiceField 吗?我一直在努力寻找例子,但没有运气。

谢谢!

    forms
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        team_names = TeamName.objects.filter(league__name='MLB').order_by('name')
        teams = [(team.id, team.name)for team in team_names]
        self.fields['team'].choices = teams

标签: pythondjangoforms

解决方案


TypedChoiceField 不是你想的那样。它只是从默认值而不是“------”空白值开始。

您无法在模型上定义选择=。而是在模型之外定义一个默认选项列表。

my_choices = (
    "foo",
    "bar",
    "pop",
)
class MyModel(models.Model):
    my_field = models.CharField(max_length=100)

然后在您的视图中,您希望导入该元组并将其传递给您的模板:

从 my_app.models 导入 my_choices

def my_view(request, *a, **kw):
    # view logic
    return render(request, "path/to/my/template", choices=my_choices)

然后在您的模板中,您可以有一个带有默认选项和字符串值的选择框。并且还有一个可选的输入类型=文本,如果填充,它将保存到该字段。

就像是:

<select name="my_field">
<option value="" selected="selected">-----</option>
{% for choice in choices %}
    <option value="{{ choice }}">{{ choice }}</option>
{% endfor %}
</select>

会给你默认的选择。然后添加一个同名的输入,这将作为一个可选的新选择。

<input type="text" name="my_field"/>

或者,您可以编写 javascript 逻辑,以确保仅提交选择框或文本字段。


推荐阅读