Ограничение набора запросов Django ModelChoiceField выбранными элементами - PullRequest
0 голосов
/ 09 февраля 2011

Вот то, за что я боролся в течение дня ...

У меня есть модель Сообщения, в которой recipients является ManyToManyField для User модели.

Тогда есть форма для составления сообщений.Поскольку есть тысячи пользователей, не удобно отображать опции в виджете множественного выбора в форме, что является поведением по умолчанию.Вместо этого, используя плагин FcbkComplete jquery, я сделал поле получателей похожим на поле ввода, где пользователь вводит получателей, и оно РАБОТАЕТ.страница, весь список пользователей отображается на странице в поле выбора, чего я не хочу по понятным причинам.

Я пытался переопределить поведение ModelChoiceField, манипулируя проверкой и набором запросов, я играл с виджетом MultipleChoice и т. Д. Но ни один из них не работал и не чувствовал себя естественно.

Итак, каков (лучший) способ избежать полного списка параметров на стороне клиента, но при этом иметь возможность проверки по набору запросов?

Ответы [ 4 ]

1 голос
/ 09 февраля 2011

Я бы попробовал один из двух способов (оба из которых могли бы быть плохими! Я действительно просто размышляю здесь вслух):

  1. Установка набора запросов поля пустым (queryset = Model.objects.none ()) и использование инструмента jquery использует представления ajax для выбора / поиска пользователей.Используйте функцию clean_field для ручной проверки правильности пользователей.

  2. Это был бы мой предпочтительный выбор: отредактируйте шаблон так, чтобы он не перебирал набор запросов поля - чтобы в html было 0 вариантов внутривыбранные теги.То есть, не используя метод form.as_p () или что-либо еще.

Одна вещь, в которой я не уверен, это то, будет ли № 2 все еще попадать в базу данных, вытаскивая объекты 5k +,просто не отображать их в HTML.Я не думаю, что это должно, но ... совсем не уверен!

1 голос
/ 09 февраля 2011

Вы видели django-ajax-selects ?Я никогда не использовал его, но он у меня в голове, когда я сталкиваюсь с проблемой, похожей на то, что, похоже, ты пытаешься решить ...

0 голосов
/ 11 февраля 2011

Я решаю это путем переопределения виджета forms.ModelMultipleChoiceField по умолчанию.Новый виджет возвращает только выбранные поля, а не весь список параметров:

class SelectMultipleUserWidget(forms.SelectMultiple):
    def render_options(self, choices, selected_choices):
        choices = [c for c in self.choices if str(c[0]) in selected_choices]
        self.choices = choices
        return super(SelectMultipleUserWidget, 
                     self).render_options([], selected_choices)

class ComposeForm(forms.Form):
    recipients = forms.ModelMultipleChoiceField(queryset=User.objects.all(),
                                                widget=SelectMultipleUserWidget)
    ...
0 голосов
/ 09 февраля 2011

Если вас не интересуют предложения, и вы можете использовать ID, Django Admin имеет атрибут raw_id_field для этих ситуаций.

Вы также можете создать виджет, который использует имя пользователя вместо идентификатора и возвращает действительного пользователя. Что-то среди строк:

# I haven't tested this code. It's just for illustration purposes
class RawUsernameField(forms.CharField):
  def clean(self, value):
    try:
      return User.objects.get(username=value)
    except User.DoesNotExist:
      rause forms.ValidationError(u'Invalid Username')
...