我正在尝试让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是空的,这可能是问题所在。也许我在这里咆哮错误的树。欢迎任何想法。
答案 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类,因此我的语法可能与您的语法不同。