1

あるケースでは django.db.models.fields.DecimalField を使用していますが、その検証エラーはかなり悪いです。

同様に、ユーザーが 3.4 の代わりに 3,4 を入力すると、「数字を入力してください」と表示されます。3,4 は、一部の国では 3.4 と同じ数です。少なくとも、コンピューターに詳しくない人には。

そのため、このフィールドの検証をオーバーライドして、自分で検証できるようにしています。

私の問題は- modelforms clean_my_field() が呼び出される前に、モデル自体の検証が機能し、すでにエラーが発生していることです。

だから私はhttps://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objectsを調べました

これを読んだ後、私は私ができることを理解しました

def full_clean(self):
    super(MyModel, self).full_clean(exclude = 'my_field')

my_field は検証から除外され、自分で検証できます

def clean(self)
    pass
    #how do i access cleaned data here anyway?
    #self.cleaned_data does not exist
    #is self.my_field the only way?

しかし悲しいかな - それはうまくいきません。self.my_field 値は clean() メソッドの古い値であり、cleaned_data はどこにも見つかりません。

このすべてが、私のアプローチが間違っていると私に思わせます。ジャンゴの DecimalField を拡張する独自のフィールドを書くことができたと思います。このアプローチはうまくいくと思いました...誰かが私のためにこれを解決できますか-なぜうまくいかないのですか。それが機能しない場合、なぜそこを除外するのですか?ちなみにDjangoのバージョンは1.4.2。

アラン

編集:私はより深く掘り下げました。すべてのモデルのクリーニング方法をオーバーライドし、スーパーをまったく使用しない場合でも、フィールドはある時点でまだクリーニングされており、それまでにエラーがすでに発生しているようです。

この場合、django.db.models.fields.DecimalField への拡張を行うと思います。

なぜexcludeがfull_cleanメソッドにあるのかについての答えはまだいいでしょう. 機能しない場合、なぜそこにあるのですか?

4

2 に答える 2

0
def views_name(request):
    ......
    field = dec_num(form.cleaned-data['....'])
    .........

    return render(request, 'page.html', {.....})


def dec_num(value):
    return value.replace(",",".")
于 2013-02-08T08:11:24.677 に答える