来自json的Django自动完成

Posted

技术标签:

【中文标题】来自json的Django自动完成【英文标题】:Django autocomplete from json 【发布时间】:2018-07-16 19:11:09 【问题描述】:

我正在尝试在 Django Admin (Django 2.0.1) 中添加一些自动完成字段。 我设法让它工作(使用 Django 中包含的自动完成功能和使用 Select2),因为在这些情况下,我从 ForeignKey 字段加载了下拉选项。

现在我需要对一个简单的 CharField 进行自动完成,但需要从返回 json 响应的远程 API 中进行选择。我可以决定如何构建 json 响应。有什么办法可以做到这一点? 返回的 json 响应不代表模型的对象,只是简单的文本选项。

【问题讨论】:

【参考方案1】:

不确定这是否符合您的需求,但这里有一个类似问题的解决方案(远程 API、JSON、自动完成文本输入)。选择部分代码:

HTML

<label>Which student? (search by last name.)</label>
<input type="text" name="studentname" id="student_name">

JS

// Build list of all students - hit API.
var ajax = new XMLHttpRequest();
ajax.open("GET", "example.com/api/student/?format=json", true);
ajax.onload = function() 
    students = JSON.parse(ajax.responseText);
    list = students.map(function(i)  
        name = i.last_name + ', ' + i.first_name;
        return name;
    );
    var input = document.getElementById("student_name");
    new Awesomplete(input,  list: list );
;
ajax.send();

所有这些当然需要the Awesomplete JS library。

这是在 Django 管理员之外工作时的解决方案,但我认为可以适应在管理员设置中工作而没有太大困难?

在您的ModelAdmin 中可能有类似的内容?

def special_field(self, obj):
    return render_to_string('special.html')
special_field.allow_tags = True

然后把前面提到的 HTML/JS 扔进special.html

最后,您需要从 ModelAdmin 中删除旧字段,添加新的自定义字段,并可能覆盖您的 ModelForm - 如下所示:

def save(self, commit=True):
    extra_input = self.cleaned_data.get('studentname', None)
    self.instance.full_name = extra_input  # the model instance to save to
    return super(NameOfYourForm, self).save(commit=commit)

【讨论】:

谢谢,它有效。只是几个变化。我在 admin.py 中做了所有事情,我没有使用 forms.py。我不得不像这样修改保存函数 def save_model(self, request, obj, form, change): extra_input = request.POST.getlist('studentname') form.instance.name = extra_input[0] # 模型实例保存返回 super(HumanAdmin, self).save_model(request, obj, form, change)

以上是关于来自json的Django自动完成的主要内容,如果未能解决你的问题,请参考以下文章

来自 db 的 Django 自动完成

来自 Json 的 Jquery 自动完成值

当源是来自 Django 的字典时,使用预取 + 远程的 Typeahead Bloodhound 自动完成

使用来自 URL 的 JSON 的 jQuery UI 自动完成

使用来自外部 JSON 的 JQuery 的自动完成表单字段不起作用

使用 JSON 数据的 Ajax / Jquery 自动完成