如何更新字段实例而不是整个字段的options选项?

时间:2018-09-26 06:54:59

标签: django django-models django-forms

我有一个模型字段,可以选择:

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,而不是单个实例。仅针对一个特定实例或不可能的正确方法是什么?

1 个答案:

答案 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}}当前流程的实例,您在运行开发服务器时通常不会注意到这些实例,但这会在生产中造成非常不稳定的行为。