我有一个模型字段,可以选择:
class MyModel(models.Model):
myfield = models.CharField(max_length=1000, choices=(('a','a'),('b','b'))
我知道我可以以表格形式访问此特定字段,并像这样覆盖其choices
选项:
self.instance._meta.get_field(field_name).choices = (('c','c'),('d','d'))
,但这将更改整个模型的choices
,而不是单个实例。仅针对一个特定实例或不可能的正确方法是什么?
答案 0 :(得分:1)
我不知道任何方法可以根据实例更改模型的字段选择,但是如果是针对表单,则可以覆盖表单的字段选择(例如从内存写入的示例,因此可能不是100%准确的):
Class MyModelForm(forms.ModelForm): 类Meta: 型号= MyModel
def __init__(self, *args, **kw):
super(MyModelForm, self).__init__(*args, **kw)
if some_condition:
self.fields["myfield"].choices = (...)
重要:您要覆盖self.fields["myfield"]
,不 self.myfield
-后者是一个类属性,因此更改它会影响所有{{ 1}}当前流程的实例,您在运行开发服务器时通常不会注意到这些实例,但这会在生产中造成非常不稳定的行为。