我有一个其中包含ChoiceField
的表单。它作为下拉框呈现给用户。可以处理数千个条目的Django的`ChoiceField`的替代形式
问题是,我在这个领域有成千上万的条目,这导致页面(a)加载速度非常慢,(b)缓慢。
我想要一个替代小部件,而不是Select
,它可以处理10,000多个选择。
类似管理员的raw_id_fields
会很好(如果只有它可用于一般形式......),但我愿意接受创意。
我有一个其中包含ChoiceField
的表单。它作为下拉框呈现给用户。可以处理数千个条目的Django的`ChoiceField`的替代形式
问题是,我在这个领域有成千上万的条目,这导致页面(a)加载速度非常慢,(b)缓慢。
我想要一个替代小部件,而不是Select
,它可以处理10,000多个选择。
类似管理员的raw_id_fields
会很好(如果只有它可用于一般形式......),但我愿意接受创意。
如果自动完成对您的UI选项,你可以去看看,以django-simple-autocomplete:能够使用jQuery用户界面自动完成构件为 ModelChoiceFields以最低配置要求
应用。
EDITED(应答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) {
我不知道什么是raw_id_fields,但为什么不使用模型来存储所有的选择?
class Choice(models.Model):
value = models.CharField()
class MyModel(models.Model):
choice = models.ForeignKey(Choice)
例如,如果一次只显示20个,那么很容易选择它。
我不明白这将如何工作。 让我澄清我的任务:我有10,000个用户。我有一个你选择用户的表单。你需要能够选择你想要的任何用户。你不能只加载20个,因为那样你将无法选择其他9,980个用户。 (分页不是一种选择,因为不得不滚动浏览数百页的用户将会非常糟糕。) – 2012-03-12 22:45:08
好的我没有正确理解你的问题。所以我认为,burhan的解决方案可能是要走的路。 – 2012-03-13 06:34:38
基于此评论(真正的,你应该已经包含在你的问题):
让我澄清我任务:我有10,000个用户。我有一个表格,其中 您选择一个用户。你需要能够选择你想要的任何用户。 您不能只加载20个,因为那样您将无法选择 其他9,980个用户。
如果你想内置的东西,你可以从django.contrib.admin.widgets
,这使过滤器对您选择使用FilteredSelectMultiple部件。
你也应该cache 10000用户的结果,所以你不会每次打你的分贝。这是造成你延迟的原因,而不是用户数量(对于实际性能问题,这很小)。
看看这个小部件的jQuery演示,在我看来,它必须包含*所有的选项作为HTML的一部分。这不会解决我的问题,因为在HTML页面中包含数千个用户名会使其加载非常缓慢。 – 2012-03-12 22:33:50
由于您的评论,我更新了帖子。 – danihp 2012-03-13 08:24:08