2013-05-10 67 views
9

比方说,比如我有一个名为“客户端”模式和一个名为“PHONENUMBERS”Django的形式多对多场50万级的对象超时

class PhoneNumbers(models.Model): 
    number = forms.IntegerField() 

class Client(models.Model): 
    number = forms.ManyToManyField(PhoneNumbers) 

客户端有一个PHONENUMBERS关系多对多模式。 PhoneNumbers拥有将近500,000条记录,因此当从模型窗体编辑客户端记录并使用随M2M提供的MultiSelect小部件时,需要永久加载。事实上,它从来没有。它只是在那里试图加载所有我假设的电话对象。

我的解决方法是使用ajax和jquery编辑客户端记录中的电话号码。在浪费我所有的时间之前,我想看看是否有另一种方式去解决它,而不会让我的页面挂起。

回答

5

您需要为此字段创建一个自定义小部件,以便您自动完成正确的记录。如果你不想推出自己的产品:http://django-autocomplete-light.readthedocs.io/

我用它来支持它的通用关系,M2M自动完成看起来也非常简单直观。请看这里使用的视频:http://www.youtube.com/watch?v=fJIHiqWKUXI&feature=youtu.be

在阅读了关于在管理员以外需要它的评论之后,我又看了一眼django-autocomplete-light库。 It provides widgets you can use outside the admin

from dal import autocomplete 
from django import forms 

class PersonForm(forms.ModelForm): 
    class Meta: 
     widgets = { 
      'myformfield': autocomplete.ModelSelect2(
       # ... 
      ), 
     } 
+0

非常感谢您的更新。我使用的是使用Django 1.3的modelformset_factory,我不相信允许'widget'kwarg被传递,但我会尝试以某种方式实现并让你知道结果。 – Austin 2013-05-12 21:43:57

+0

modelformset_factory采用选项表单对象。 'myModelFormset = modelformset_factory(Author,form = AuthorForm)'see:http://stackoverflow.com/questions/2853350/using-a-custom-form-in-a-modelformset-factory和https://docs.djangoproject。 COM/EN/1.5/REF /表格/模型/#django.forms.models.modelformset_factory – 2013-05-13 14:36:10

4

开箱即用,模型管理员拥有一个raw_id_fields选项,可让您的页面加载速度更快。但是,原始ID字段的用户界面不太直观,因此您可能需要推出自己的解决方案。

+2

是的,会是完美的,以及如果我只需要它在管理员。不过,我要求它位于管理员之外的模板中。 – Austin 2013-05-10 17:28:41

0

我们用这个第三方插件本:

https://github.com/crucialfelix/django-ajax-selects

顺便说一句,你的“示例”上面是非常糟糕的DB设计了一堆理由。您只需要将电话号码作为客户端模型上的文本字段,然后就不会有这些问题。 ;-)