2013-05-10 2 views
9

Допустим, например, у меня есть модель под названием «Клиент» и модель под названием «номера телефонов»Django формы с полем ManyToMany с 500.000 объектов раз из

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

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

Клиент имеет отношения ManyToMany с номера телефонов. PhoneNumbers имеет почти 500 000 записей, поэтому, когда дело доходит до редактирования записи клиента из модельной формы с помощью виджета MultiSelect, который поставляется с зарегистрированным M2M, он навсегда загружается. На самом деле этого никогда не бывает. Он просто сидит там, пытаясь загрузить все те объекты, которые я предполагаю.

Мое обходное решение было связано с такими утомительными вещами, когда 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

Большое спасибо за ваше обновление. Я использую modelformset_factory с использованием Django 1.3, который, как я полагаю, не допускает пропускание «виджета», но я попытаюсь каким-то образом реализовать и дать вам знать результаты. – Austin

+0

modelformset_factory принимает объект формы опции. 'myModelFormset = modelformset_factory (Author, form = AuthorForm)' см: http://stackoverflow.com/questions/2853350/using-a-custom-form-in-a-modelformset-factory и https: //docs.djangoproject. ком/о/1,5/иая/форма/модель/# django.forms.models.modelformset_factory –

4

Из-за гаджета администратор модели имеет опцию raw_id_fields, которая позволяет загружать вашу страницу намного быстрее. Однако пользовательский интерфейс полей raw id не очень интуитивно понятен, поэтому вам, возможно, придется сворачивать свое собственное решение.

+2

Yup, было бы идеально, ну сорта, если бы мне это было нужно только в admin. Однако я требую, чтобы он находился внутри шаблона вне администратора. – Austin

0

Мы используем этот 3-й партии виджет для этого:

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

Btw, ваш 'пример' выше действительно плохой дизайн DB для кучу причин. Вы должны просто указать номер телефона в текстовом поле на модели клиента, а затем у вас не будет ни одной из этих проблем. ;-)

Смежные вопросы