我的表单中包含ChoiceField
。它将作为下拉框呈现给用户。
问题是,我在这个领域有成千上万的条目,这导致页面(a)加载非常缓慢,(b)缓慢。
我想要一个可以处理10,000多个选择的替代小部件,而不是Select
。
管理员的raw_id_fields
之类的东西会很好(如果只有它可用于一般形式......)但我对这些想法持开放态度。
答案 0 :(得分:1)
如果自动填充是您的用户界面的一个选项,您可以查看django-simple-autocomplete:
应用程序启用jQuery UI自动完成小部件 ModelChoiceFields需要最少的配置。
已编辑(回复OP评论)
我还没有测试过这个解决方案,但是挖掘文档和源代码似乎并非所有数据都是一次加载的:
指定窗口小部件的URL的功能使您可以连接到 如果您愿意,可以使用其他更高级的自动填充查询引擎。
def get_json(request, token):
"""Return matching results as JSON"""
...
di = {'%s__istartswith' % fieldname: searchtext} # <- look here!
items = queryset.filter(**di).order_by(fieldname)[:10]
$("#id_%(name)s_helper").autocomplete({
source: function(request, response){
$.ajax({ # <-- look here
url: "%(url)s",
data: {q: request.term},
success: function(data) {
答案 1 :(得分:0)
我不知道raw_id_fields是什么,但为什么不使用模型来存储你的所有选择呢?
class Choice(models.Model):
value = models.CharField()
class MyModel(models.Model):
choice = models.ForeignKey(Choice)
如果你想一次只显示20个,那么就很容易选择它。
答案 2 :(得分:0)
基于此评论(实际上,您应该包含在您的问题中):
让我澄清一下我的任务:我有10,000名用户。我有一个表格 你选择一个用户。您需要能够选择任何您想要的用户。 你不能只加载20,因为那时你将无法选择 其他9,980位用户。
如果您想要内置的内容,可以使用django.contrib.admin.widgets
中的FilteredSelectMultiple小部件,它会在您的选择中添加过滤器。
您还应该cache 10,000个用户的结果,这样您每次都不会点击数据库。这是造成延迟的原因,而不是用户数量(对于实际性能问题而言,这是微不足道的。)