8

バックグラウンド

空白に設定された 2 つのフィールドを持つモデルがあります。

class News(models.Model):                                                                                                                                                                                           
    title = models.CharField(max_length = 50, blank = True)                                                                                                                                                         
    info = models.TextField(blank = True)

問題は、フォームの作成時に動的に設定したいmax_lengthので、カスタムフォームを持っていることです:

class NewsForm(forms.ModelForm):                                                                                                                                                                                    
    def __init__(self, *args, **kwargs):                                                                                                                                                                            
        super(NewsForm, self).__init__(*args, **kwargs)                                                                                                                                                             

        title_max_length = 20                                                                                                                                                                                       
        info_max_length = 100                                                                                                                                                                                       

        self.fields["title"] = forms.CharField(max_length = title_max_length)                                                                                                                                       
        self.fields["info"] = forms.CharField(                                                                                                                                                                      
            widget = forms.Textarea,                                                                                                                                                                                
            validators = [                                                                                                                                                                                          
                MaxLengthValidator(info_max_length)                                                                                                                                                                 
            ]                                                                                                                                                                                                       
        )  

注: これら 2 つの長さの値は実際にはデータベースから取得されますが、例を短くするためにそのコードを含めないことにしました。

問題

これらのカスタム フィールドを使用すると、blankオプションが上書き/無視されます。

次のように、max_length、widget、バリデーターを既存のフィールドに追加してみました。

class NewsForm(forms.ModelForm):                                                                                                                                                                                    
    def __init__(self, *args, **kwargs):                                                                                                                                                                            
        super(NewsForm, self).__init__(*args, **kwargs)                                                                                                                                                             

        title_max_length = 20                                                                                                                                                                                       
        info_max_length = 100                                                                                                                                                                                       

        self.fields["title"].max_length = title_max_length                                                                                                                                                          
        self.fields["info"].widget = forms.Textarea                                                                                                                                                                 
        self.fields["info"].validators = [MaxLengthValidator(info_max_length)] 

これを行うと、blankオプションは機能しますが、動的 max_length はフォームに適用されません。

django のソースを調べてみましたが、私はかなり新しいので、今は多すぎて取り入れられません。

これを達成する方法はありますか?

4

1 に答える 1

28

フォームを作成するときに、 、ウィジェット、およびバリデーターとCharFieldは別に、次のパラメーターを追加します。max_length

forms.CharField(...,required = False)

Django ではblank=True、モデルrequired=False内はフォーム内に対応しています。

于 2013-05-07T08:22:29.433 に答える