我对Django及其方式非常陌生。我正在尝试为表单创建自动完成字段。我的代码如下
表格
from django import forms
class LeaveForm(forms.Form):
leave_list = (
('Casual Leave', 'Casual Leave'),
('Sick Leave', 'Sick Leave')
)
from_email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'style': 'width: 400px'}))
start_date = end_date = forms.CharField(widget=forms.TextInput(attrs={'type': 'date', 'style': 'width: 175px'}))
leave_type = forms.ChoiceField(choices=leave_list, widget=forms.Select(attrs={'style': 'width: 400px'}))
comments = forms.CharField(required=True, widget=forms.Textarea(attrs={'style': 'width: 400px; height: 247px'}))
def clean_from_email(self):
data = self.cleaned_data['from_email']
if "@testdomain.com" not in data:
raise forms.ValidationError("Must be @testdomain.com")
return data
我要实现的是,当用户在"From Email"
字段中键入单词时,我存储在外部数据库中的电子邮件列表应出现在自动完成列表选项中。
models.py
from django.db import models
class ListOfUsers(models.Model):
emp_number = models.CharField(db_column='Emp_Number', primary_key=True, max_length=50, unique=True) # Field name made lowercase.
name = models.CharField(db_column='Name', max_length=40) # Field name made lowercase.
supervisor = models.CharField(db_column='Supervisor', max_length=40) # Field name made lowercase.
email = models.CharField(db_column='Email', max_length=50, blank=False, null=False, unique=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'List of users'
任何想法如何做到这一点?
更新:
我开始弄乱django-autocomplete-light,现在能够从自动完成网址获得回复。看起来像这样
{"results": [{"id": "[email protected]", "text": "[email protected]"}, {"id": "[email protected]", "text": "[email protected]"}, {"id": "[email protected]", "text": "[email protected]"}]}
views.py
class EmailAutocomplete(autocomplete.Select2ListView):
def get_list(self):
qs = ListOfUsers.objects.using('legacy')
if self.q:
qs = qs.filter(email__icontains=self.q).values_list('email', flat=True)
return qs
我仍然不知道如何获取此数据以显示在字段中 "from_email"
我终于按照此处找到的说明进行了自动完成搜索
https://github.com/xcash/bootstrap-autocomplete
https://bootstrap-autocomplete.readthedocs.io/en/latest/
它非常简单易用,不需要安装任何应用程序,settings.py
并且对bootstrap 3和bootstrap 4都适用。
还有许多其他软件包可用,但这对我来说很简单。
我将解释我使用的代码
page.html
{% block script %}
<script src="https://cdn.rawgit.com/xcash/bootstrap-autocomplete/3de7ad37/dist/latest/bootstrap-autocomplete.js"></script>
<script>
$('.basicAutoComplete').autoComplete(
{minLength: 1}
);
$('.dropdown-menu').css({'top': 'auto', 'left': 'auto'})
</script>
{% endblock %}
.
.
.
.
.
{% if field.name == "from_email" %}
{% render_field field class="basicAutoComplete form-control" %}
{% else %}
{% render_field field class="form-control" %}
{% endif %}
autoComplete
是执行该操作所调用的函数,并minLength
在执行提取操作之前指定了文本的最小长度。我添加了额外的CSS来修复自动完成下拉菜单,否则很奇怪。
Jinja渲染器不断从视图覆盖类定义,因此我添加了if检查。
urls.py
from . import views
urlpatterns = [
.
.
.
path('email_autocomplete/', views.email_autocomplete, name='email_autocomplete')
]
将此行添加到 urls.py
表格
class LeaveForm(forms.Form):
from_email = forms.EmailField(required=True, widget=forms.TextInput(
attrs={
'style': 'width: 400px',
'class': 'basicAutoComplete',
'data-url': "/domain/email_autocomplete/"
}))
上面是中输入字段的代码forms.py
。data-url指向将在其中生成JSON结果的位置。
views.py
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from .models import model
def email_autocomplete(request):
if request.GET.get('q'):
q = request.GET['q']
data = model.objects.using('legacy').filter(email__startswith=q).values_list('email',flat=True)
json = list(data)
return JsonResponse(json, safe=False)
else:
HttpResponse("No cookies")
这对我来说是最令人困惑的部分。GET请求很容易理解,但是花了一些时间才能将数据model.objects
转换为JSON格式的对象。诀窍是使用
values_list('columnName',flat=True)
从数据库中过滤数据时,然后使用转换为列表list(data)
,最后使用JsonResponse
将其转换为JSON。
希望这对想要简单自动完成的任何人有帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句