2013-05-10 69 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設計了一堆理由。您只需要將電話號碼作爲客戶端模型上的文本字段,然後就不會有這些問題。 ;-)