1

我正在尝试使 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 是空的,这可能是问题所在。也许我在这里叫错了树。欢迎任何想法。

4

3 回答 3

1

用一个ModelChoiceField

class CompanyNoteForm(forms.ModelForm):
    company = forms.ModelChoiceField(queryset=models.Company.objects.all(), widget=forms.widgets.Select(attrs={'readonly': 'readonly'}))
于 2013-01-25T18:22:37.203 回答
1

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

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

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

否则请检查此答案

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

于 2013-01-26T06:26:16.940 回答
0

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

widgets = {'field_name': forms.HiddenInput()}

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

于 2020-02-12T17:26:59.130 回答