设置只读Choice(ForeignKey)字段的初始值

时间:2013-01-25 17:41:39

标签: django forms django-forms

我正在尝试让CreateView拥有一个带有设定值的只读字段,但我无法做到这一点。

我有一个带有ForeignKey的模型到另一个模型:

class CompanyNote(TimeStampedModel):
    company = models.ForeignKey(Company)
    note = models.TextField(blank=True)

我有一个CreateView:

class CompanyNoteCreateView(CreateView):
    model = models.CompanyNote
    form_class = CompanyNoteForm

使用自定义ModelForm:

class CompanyNoteForm(forms.ModelForm):

    company = forms.ChoiceField(
        widget=forms.widgets.Select(attrs={'readonly': 'readonly'}))

    class Meta:
        model = models.CompanyNote

如您所见,相关字段的窗口小部件是只读的。这是因为我选择将公司作为URL的一部分,如company/1/note/add中所示。我可以轻松拿起“1”并找到合适的公司对象,但我不知道如何设置只读字段。

我试过了:

def get_initial(self):
    initial = super(CompanyNoteCreateView, self).get_initial()
    initial['company'] = self.get_company().id
    return initial

但那没用。 Widget是空的,这可能是问题所在。也许我在这里咆哮错误的树。欢迎任何想法。

3 个答案:

答案 0 :(得分:1)

使用ModelChoiceField

class CompanyNoteForm(forms.ModelForm):
    company = forms.ModelChoiceField(queryset=models.Company.objects.all(), widget=forms.widgets.Select(attrs={'readonly': 'readonly'}))

答案 1 :(得分:1)

您是否尝试过在Form的Meta类中设置属性?

我遇到了一个问题,如果在基类定义中设置了Form属性,那么它们没有应用于模型字段,但它们在Meta类中正常工作:

class CompanyNoteForm(forms.ModelForm):
    class Meta:
        model = models.CompanyNote
        widgets = {'company': forms.widgets.Select(attrs={'readonly': True,
                                                          'disabled': True})}

否则请检查this answer

最糟糕的情况是,让公司成为一个隐藏的领域?

答案 2 :(得分:0)

我在任何地方都找不到这个答案,实际上我可以上班了。但是我发现了另一种方法。将字段设置为使用Forms.HiddenInput()小部件隐藏。然后将从视图中传入的值将被分配,但用户将无法访问它。

@EnableClusterDefinedRegions

我正在使用ModelForm类,因此我的语法可能与您的语法不同。