0

我有一个 MultipleChoiceField,为了显示之前在管理员中选择的值,我必须从 ModelForm覆盖方法init 。我有以下课程及其形式:

class Profile(models.Model):
    name = models.CharField(max_length=64)
    contract = models.CharField(max_length=100)

class ProfileForm(forms.ModelForm):
    CONTRACT_CHOICES = (
        ('scholar', _(u'Scholar')),
        ('freelance', _(u'Freelance')),
        ('contract', _(u'Contract')),
        ('volunteer', _(u'Volunteer'))
    )
    contract = forms.MultipleChoiceField(choices=CONTRACT_CHOICES)

    def __init__(self, *args, **kwargs):
        initial = kwargs.get('initial',{})
        initial['contract'] = ['scholar', 'contract', 'freelance'] #Here I would have to be able to get the attribute contract from the Profile class, not this list
        kwargs['initial'] = initial
        super(ProfileForm, self).__init__(*args, **kwargs)

使用initial['contract']=['scholar','contract','freelance']作品(此值显示为选中),但我必须使用 Profile 的属性合同来实现这一点。我知道您可以从具有属性instance的 ModelForm 访问模型,但是有一个问题:只有在调用 init 的本机方法后才能访问实例。在这种情况下,我必须稍后再调用它,否则它对我不起作用。我已经尝试过以下方式:

def __init__(self, *args, **kwargs):
    super(ProfileForm, self).__init__(*args, **kwargs)
    self.fields['contract'].initial = self.instance.contract

但这不起作用(它没有显示错误,但所选属性未显示为选中状态)。此外,以下内容也不起作用:

def __init__(self, *args, **kwargs):
    super(ProfileForm, self).__init__(*args, **kwargs)
    self.fields['contract'].initial = ['scholar', 'contract', 'freelance']

它仅作为第一种方式起作用,但存在我不知道如何访问属性合同的问题。有任何想法吗?提前致谢

4

0 回答 0