如何使用Django在表单中创建自动完成输入字段

Abilash amarasekaran

我对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"

Abilash amarasekaran

我终于按照此处找到的说明进行了自动完成搜索

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.pydata-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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django中创建自动递增整数字段?

如何禁用Web表单字段/输入标签上的浏览器自动完成功能?

如何基于句子结构在输入字段中创建多个自动完成功能?

如何使用jQuery检测表单的任何输入字段中的更改?

Bootstrap输入字段中的样式jQuery自动完成

为输入字段创建自定义自动完成列表

JqGrid:表单字段中的自动完成

如何在没有JQuery的情况下使用Bootstrap 4在Angular应用中实现自动完成输入字段

django中的“自动完成”字段

如何在Material ui自动完成的输入文本字段中显示所选值?

Laravel + Vue Js中输入字段为空时如何清除自动完成结果?

如何在HTML表单中创建美元金额输入字段?

自动完成的Cakephp表单输入

如何订购在Django中动态创建的模型表单字段

php和mysql中的自动完成表单字段

如何处理Django表单中的“现在自动”字段?

如何保留自动完成中输入的内容

动态表单输入字段和使用AJAX自动完成

如何在Web表单字段/输入标签上禁用浏览器自动完成功能?

在Chrome中关闭“密码”输入字段的自动完成功能

在 javafx 中创建自动完成搜索表单

单击实时搜索结果时如何自动完成输入字段

自动完成输入字段 - JS

如何在activeadmin中获取自动完成/搜索字段作为输入

使用 Django 处理来自输入字段或表单字段的输入

Jquery 自动完成 - 在多个输入字段中添加值

如何使用自动完成功能创建文本输入,然后在 express 中显示来自 mysql 数据库的数据?

如何使用 Leaflet 的 Geosearch 插件获取常规表单字段以自动完成地理搜索?

如何使用自动空间创建自定义输入字段以输入车辆号牌