Отображение подмножества данных с помощью Django ModelChoiceField и связанных данных

#python #django #forms #django-forms #django-queryset

#python #django #формы #django-формы #django-набор запросов

Вопрос:

При использовании ModelChoiceField в Django forms я хочу, чтобы отображалось только подмножество данных (в моем случае последние 100 записей), поскольку набор данных очень большой. В то же время я хочу, чтобы пользователь по-прежнему мог выбирать из любого объекта в базе данных, а не только из тех, которые отображаются по умолчанию (я использую AJAX для запроса параметров, не отображаемых по умолчанию).

Мне удалось сделать это, создав подклассы ModelChoiceField и ModelChoiceIterator.

 class SubsetModelChoiceIterator(ModelChoiceIterator):
    def __init__(self, field):
        self.field = field
        self.queryset = field.subset_queryset

class SubsetModelChoiceField(forms.ModelChoiceField):
    """
    This is just like a ModelChoiceField, but only a subset of the full
    queryset will be displayed as choices.
    """

    def __init__(self, subset_queryset, *args, **kwargs):
        self.subset_queryset = subset_queryset
        super(SubsetModelChoiceField, self).__init__(*args, **kwargs)

    def _get_choices(self):
        if hasattr(self, '_choices'):
            return self._choices

        return SubsetModelChoiceIterator(self)
    choices = property(_get_choices, forms.ChoiceField._set_choices)

    def _get_subset_queryset(self):
        return self._subset_queryset

    def _set_subset_queryset(self, queryset):
        self._subset_queryset = queryset
        self.widget.choices = self.choices
  

При определении поля формы теперь я могу предоставить 2 набора запросов: один, по которому будут проверены отправленные данные, и другой, который будет отображаться.

 class MyForm(Form):
    some_option = SubsetModelChoiceField(queryset=MyModel.objects.all(),
                                         subset_queryset=MyModel.objects.all()[:100],)
  

Это работает нормально, однако возникает проблема с удобством использования.
Когда пользователь выбирает параметр, не отображаемый по умолчанию, но другое поле формы приводит к сбою проверки связанной формы, то при перезагрузке страницы выбранный пользователем параметр не будет предварительно выбран, поскольку он не найден в «subset_queryset».

У кого-нибудь есть идея, как я мог бы это решить?

Спасибо.

Комментарии:

1. Я сталкиваюсь именно с этой проблемой. Вы нашли работоспособное решение?

Ответ №1:

Технически это не вопрос Django. Лучше всего хранить информацию о состоянии списка в скрытом поле (не обязательно элементы, но информация, которая вам нужна, чтобы знать, как снова получить эти элементы). Затем передайте эту информацию обратно в шаблон и используйте свои функции AJAX для ее повторного извлечения.