2012-03-12 55 views
1

我有一个其中包含ChoiceField的表单。它作为下拉框呈现给用户。可以处理数千个条目的Django的`ChoiceField`的替代形式

问题是,我在这个领域有成千上万的条目,这导致页面(a)加载速度非常慢,(b)缓慢。

我想要一个替代小部件,而不是Select,它可以处理10,000多个选择。

类似管理员的raw_id_fields会很好(如果只有它可用于一般形式......),但我愿意接受创意。

回答

1

如果自动完成对您的UI选项,你可以去看看,以django-simple-autocomplete:能够使用jQuery用户界面自动完成构件为 ModelChoiceFields以最低配置要求

应用。

EDITED(应答OP评论)

我没有测试过该方案,但挖文档和源代码,似乎并非所有数据都在同一时间下载:

的能力要指定小部件的URL,您可以根据需要连接其他更高级的自动完成查询引擎。

Source code

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] 

Widget source code

$("#id_%(name)s_helper").autocomplete({ 
    source: function(request, response){ 
     $.ajax({         # <-- look here 
      url: "%(url)s", 
      data: {q: request.term}, 
      success: function(data) { 
+0

看看这个小部件的jQuery演示,在我看来,它必须包含*所有的选项作为HTML的一部分。这不会解决我的问题,因为在HTML页面中包含数千个用户名会使其加载非常缓慢。 – 2012-03-12 22:33:50

+0

由于您的评论,我更新了帖子。 – danihp 2012-03-13 08:24:08

0

我不知道什么是raw_id_fields,但为什么不使用模型来存储所有的选择?

class Choice(models.Model): 
    value = models.CharField() 

class MyModel(models.Model): 
    choice = models.ForeignKey(Choice) 

例如,如果一次只显示20个,那么很容易选择它。

+0

我不明白这将如何工作。 让我澄清我的任务:我有10,000个用户。我有一个你选择用户的表单。你需要能够选择你想要的任何用户。你不能只加载20个,因为那样你将无法选择其他9,980个用户。 (分页不是一种选择,因为不得不滚动浏览数百页的用户将会非常糟糕。) – 2012-03-12 22:45:08

+0

好的我没有正确理解你的问题。所以我认为,burhan的解决方案可能是要走的路。 – 2012-03-13 06:34:38

0

基于此评论(真正的,你应该已经包含在你的问题):

让我澄清我任务:我有10,000个用户。我有一个表格,其中 您选择一个用户。你需要能够选择你想要的任何用户。 您不能只加载20个,因为那样您将无法选择 其他9,980个用户。

如果你想内置的东西,你可以从django.contrib.admin.widgets,这使过滤器对您选择使用FilteredSelectMultiple部件。

你也应该cache 10000用户的结果,所以你不会每次打你的分贝。这是造成你延迟的原因,而不是用户数量(对于实际性能问题,这很小)。