来自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自动完成的主要内容,如果未能解决你的问题,请参考以下文章
当源是来自 Django 的字典时,使用预取 + 远程的 Typeahead Bloodhound 自动完成
使用来自 URL 的 JSON 的 jQuery UI 自动完成