在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”中找不到。 / p>
有谁知道如何解决这个问题?
感谢。
答案 0 :(得分:0)
这在技术上不是Django的问题。您最好的选择是将有关列表状态的信息存储在隐藏字段中(不是必需的项目,而是您需要知道如何再次获取这些项目的信息)。然后,将该信息传递回模板并使用您的AJAX功能再次获取它。