Python 更改模型的选项属性';s场

Python 更改模型的选项属性';s场,python,django,oop,django-models,django-forms,Python,Django,Oop,Django Models,Django Forms,这个问题类似于 但是,我的问题是,我想在类级别更改choices属性的默认值 我有这个 class Project(models.Model): name = models.CharField(...) @staticmethod def getAllProjectsTuple(): return tuple([(p.id, p.name) for p in Project.objects.all()]) class Record(models.Mo

这个问题类似于 但是,我的问题是,我想在类级别更改choices属性的默认值

我有这个

class Project(models.Model):

    name = models.CharField(...)

    @staticmethod
    def getAllProjectsTuple():
        return tuple([(p.id, p.name) for p in Project.objects.all()])

class Record(models.Model):

      project = models.ForeignKey(
                            Project,
                            verbose_name='Project',
                            help_text='Project name',
                            blank=True, null=True,
                            on_delete=models.SET_NULL,
                            choices = Project.getAllProjectsTuple(),

class RecordForm(ModelForm):

       class Meta:
              model = Record
我的问题是,所有记录表单都将使用模块导入时模型中的可用选项创建一个TypedChoiceField。但是,用户可以创建更多的项目,这些项目永远不会出现在记录表单中;删除时相同

我试图直接篡改记录表单的init

self.fields['project']._choices = [('', '---------'),] + [(p.id, p.name) for p in Project.objects.all()]
或使用记录的init

self._meta.get_field('project')._choices = Project.getAllProjectsTuple()
但似乎什么都不管用


谢谢你的帮助。

我刚刚发现:

self.fields['project'].choices = [('', '----------')] + [(p.id, p.name) for p in Project.objects.all()]

在RecordForm的init中也会执行此操作。但是@Peter DeGlopper在评论中的回答更好。

为什么要使用选项,而不仅仅是使用标准的
ModelSelectWidget
和查询集?默认行为与您的
getAllProjectsTuple
行为相同。只需
choices=Project.objects.values\u list('id','name')
?@Peter,这实际上解决了问题。我不知道我是怎么理解的。如果我不推翻它,这就是Django魔术,它会一直重新评估选择吗?谢谢大家!@卡提克,那不行。我认为与原始版本的原因相同:在模型导入时只对其进行一次评估。要改变这一点,您可以选择简单但范围广泛的选项,即更改
项目
\uuuuunicode\uuuu>方法,或者,更复杂的选项是对字段进行子类化,并覆盖其
label\u from\u instance
方法,如本文所述:-后者只影响字段,而不影响Django可能代表
项目
实例的其他位置。