not どのようにデフォルト値をDjangoモデルIntegerfieldに割り当てるか、関連するFormFieldはオプションですか?



django model email field (1)

フィールドをオプションにしたい - モデルに2番目の定義を残して、フォーム定義に何も追加しないでください:

class Invoice(models.Model):
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True)

class InvoiceForm(forms.ModelForm):
    class Meta:
        model = Invoice

更新するので、値が設定されていない場合は、フィールド値として1を使用します。

class InvoiceForm(forms.ModelForm):

    def clean_expireDays(self):
        exp_days = self.cleaned_data.get('expireDays')
        if exp_days is None:
            return self.fields['expireDays'].initial
            # above can be: return 1
            # but now it takes value from model definition
        else:
            return exp_days

    class Meta:
        model = Invoice

私はデフォルト値でDjangoモデルフィールド(IntegerField)を作成し、フィールドがオプションであるモデルから派生したフォームを作成したいと思います。 フォームに設定されていない場合、フォームを保存すると、デフォルト値がDBに保存されます。

# model.py
class Invoice(models.Model):
    # IntegrityError "Column 'expireDays' cannot be null"
    expireDays = models.PositiveSmallIntegerField(default=1)

    # expireDays = *null* in DB
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True)

# forms.py
class InvoiceForm(forms.ModelForm):
    # leaving this line out gives invalid form
    expireDays = forms.IntegerField(required=False)
    class Meta:
        model = Invoice

(私は、 一度にフィールド宣言行のうちの1つだけを使用しました。

私は、私がデフォルト値を正しく宣言していることさえ確信していません。 私が見つけることができる唯一の参考資料は、James Bennettの選択肢扱う記事でした。 私はまだDjangoのドキュメントでそれを見つける必要があります(私はバージョン1.2を使用しています - おそらく1.3に入っていますか?)

更新 - MySqlデータベースでフィールドのデフォルト値を設定しようとしましたが効果がありません。 フォームにフィールドの値がない場合でも、MySqlのデフォルト値をオーバーライドしてDBにnullを割り当てているかのように見えます。

私は現在、フォームを作成するビューにデフォルト値を設定していますが、フィールドの整合性の責任をビューではなくDBに置いているので、実際にはそれが気に入らないのです。

私がそれがうまくいくと思う方法は、フィールドが設定されているかどうかです。設定されていれば、その値がDBに書き込まれ、設定されていなければ、DBのデフォルトが使用されます。 代わりに、設定されていない場合、フォームはDBにnullを書き込んでいます 。 では、ModelField宣言でデフォルト値を使用していない場合、それはどういう意味ですか? それは正確に何をしますか?





django-models