在ModelChoiceField中显示的项目的自定义顺序

2024-04-18 12:52:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看过一些老问题了,但没有找到能解决我问题的答案。在

好吧,假设我有一个叫做“Project”的模型:

class Project(models.Model):
  name = models.CharField(max_length=50)
  parentproject = models.ForeignKey('self', related_name="parentproject_related", blank=True, null=True,
                                  verbose_name="parent project")

  ... a lot more ...

所以用这个模型我可以创建项目和子项目。一个项目可以有几个子项目,这些子项目可以由parentproject字段标识。在

DB中,所有项目都在一个表中:

^{pr2}$

借助两个for循环,an可以在数据模型上创建真实视图:

^{3}$

现在我希望这个排序的列表显示在ChoiceField中,这样用户就可以选择适当的项目。有没有一个简单的方法来实现这一点?为了更好的可读性,最好缩进子项目的名称。在

到目前为止谢谢你!在


Tags: 项目答案name模型projecttruemodelmodels
2条回答

我大量使用mptt,我同意,如果你不需要多个层次的深度,那么最好避免它,因为它确实会带来一些限制和潜在的问题与树腐蚀。在

以下是我过去解决这个问题的方法,灵感来自mptt的tree field:

表单.py

from django import forms

from .fields import ProjectChoiceField
from .models import Project


    class ProjectForm(forms.ModelForm):

        parentproject = ProjectChoiceField(
            queryset=Project.objects.all(), required=False)

        class Meta:
            fields = ['name', 'parentproject']
            model = Project

字段.py

^{pr2}$

在管理中的外观:

admin

您应该考虑使用django-mptt项目来帮助您。它支持树状结构,因此您可以非常容易地创建项目和子项目关系。也可以在一个sql查询中获取子树,而无需遍历树。在

下面是他们关于如何创建父关系的官方示例:http://django-mptt.github.io/django-mptt/tutorial.html#set-up-your-model

相关问题 更多 >