我有一个简单的模型
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/