Django 文本输入提前自动完成

标签 django django-forms

我有一个简单的模型

class Thing(models.Model):

    name = models.CharField(max_length=40)
    language = models.CharField(max_length=2, default='de')
    date_from = models.DateField(default=timezone.now)

在输入现有行中的现有名称时,应在表单中预填充 name 字段。我看了一下 django-select2 或 django-autocomplete-light。但是这两个包主要用于 ForeignKeys。事实上,我在我的项目中也是这样做的。

有没有人知道一种简单的方法来解决这个任务,而无需在 JavaScript 中进行大量修改。

最佳答案

如果不走 JavaScript 路线,我会使用数据列表。

<label for="name-id">Name: </label>
    
<input list="names" name="name" id="name-id" />
    
<datalist id="names">
    <option value="Vione">
    <option value="Veya">
    <option value="Argo">
    <option value="Paro">
    <option value="Esena">
    <option value="Sanar">
</datalist>

这可以在 Django 中实现如下:

# Your view

class ThingCreateView(CreateView):
    model = Thing
    success_url = reverse('thing-list')

    def get_form(self, form_class=None):
        form = super().get_form(form_class)

        # make the 'name' field use a datalist to autocomplete
        form.fields['name'].widget.attrs.update({'list': 'names'})

        return form

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # add `names` to the context to populate the datalist
        context['names'] = Thing.objects.values_list('name', flat=True)

        return context

# Your form
<form method="post">
    {% csrf_token %}

    {{ form.as_p }}

    <datalist id="names">
        {% for name in names %}
        <option value="{{ name }}">
        {% endfor %}
    </datalist>

    <input type="submit" value="Save" />
</form>

关于Django 文本输入提前自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44044655/

相关文章:

django admin 1.11 向选择的选项添加属性

django - 表单验证错误和错误代码

python - 如何分配和管理优先级机制

django - 如何在Django中将模型字段设为可选?

Django channel : Save messages to database

python - GeoDjango 和混合器。 'PointField'没有属性 '_meta'

python - 如何从 Django 管理上传多个文件?

python - 自定义模板中的 Django ManyToManyField?

Django:如何将 <a> 超链接放入表单 clean() 方法的 django 验证错误中?

python - Django 加载静态文件?