Django 多选表单与父类别

0 投票
2 回答
866 浏览
提问于 2025-04-16 18:34

我有一个简单的模型,长得像这样:

class Neighborhood(models.Model):
    name = models.CharField(max_length=255)
    borough = models.ForeignKey(Borough)

    def __unicode__(self):
        return self.name

在我的forms.py文件里,我有一个简单的表单,里面有一些选项:

class SearchForm(forms.Form):
    neighborhood = forms.ModelMultipleChoiceField(required=False, queryset=Neighborhood.objects.all(), widget=CheckboxSelectMultiple())

这样做没问题,它会列出我Neighborhood模型里的所有选项。看起来大概是这样的:

  • Lower East Side
  • Times Square
  • East Village
  • West Village
  • ...等等

    不过,我想在列表中显示每个社区的父类别,也就是区。希望的效果是这样的:

  • 布鲁克林

    • 威廉斯堡
    • DUMBO
    • ...
  • 曼哈顿
    • Lower East Side
    • Times Square
    • West Village
    • East Village
  • 皇后区
    • ...

我试着把这两个不同的对象调用出来,并把它们合并成一个自定义列表,但我无法通过查询集传递这个,因为它给了我一个AttributeError,提示没有'all'可用。

有没有其他方法可以做到这一点呢?

2 个回答

0

给未来遇到同样问题的人:

我找到了一篇文章,里面讲了怎么通过创建一个自定义的ModelChoiceIterator(这个类负责生成选择字段的选项)来实现,并且让它包含父类别。

顺便说一下,作者创建了一个新的ModelChoiceField,使用了这个新的迭代器,但我觉得现在你可以直接通过ModelChoiceField和ModelMultipleChoiceField的迭代器参数来设置自定义的迭代器(文档链接

1

我觉得最好的办法是为这个写一个自定义的表单小部件。

一个简单(而且也不错)的方法是手动在模板中输出 <select> 标签。使用 regroup 过滤器就能完成所有的工作。

撰写回答