【问题标题】:Displaying a subset of data with Django ModelChoiceField and bound data使用 Django ModelChoiceField 和绑定数据显示数据子集
【发布时间】:2011-09-01 01:57:13
【问题描述】:

在 Django 表单中使用 ModelChoiceField 时,我只希望呈现数据的一个子集(在我的例子中是最后 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”中找不到。

有人知道我该如何解决这个问题吗?

谢谢。

【问题讨论】:

  • 我遇到了这个确切的问题。您找到可行的解决方案了吗?

标签: python django forms django-forms django-queryset


【解决方案1】:

从技术上讲,这不是 Django 问题。您最好的选择是将有关列表状态的信息存储在隐藏字段中(不一定是项目,而是您需要知道如何再次获取这些项目的信息)。然后,将该信息传递回模板并使用您的 AJAX 功能再次获取它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2013-06-06
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多