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

しかし、それはうまくいきませんでした。ウィジェットが空です。これが問題である可能性があります。おそらく、私はここで間違ったツリーを吠えています。どんなアイデアでも大歓迎です。

4

3 に答える 3

1

フォームのメタクラスに属性を設定してみましたか?

基本クラス定義で設定されている場合、フォーム属性がモデルフィールドに適用されないという問題が発生しましたが、メタクラスでは正しく機能しました。

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 に答える
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 に答える
0

この答えはどこにも見つかりませんでした。実際に仕事に取り掛かることができました。しかし、私は別のアプローチを見つけました。forms.HiddenInput() ウィジェットでフィールドを非表示に設定します。次に、ビューから渡した値が割り当てられますが、ユーザーはそれにアクセスできません。

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

私は ModelForm クラスを使用しているため、私の構文はあなたのものとは異なる場合があります。

于 2020-02-12T17:26:59.130 に答える