9

ここで何かが足りないかもしれませんが、django docs によると、管理フォームから送信された値を clean() メソッド内でオーバーライドできるはずです。ジャンゴのドキュメントから

def clean(self):
    from django.core.exceptions import ValidationError
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
        raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
        self.pub_date = datetime.date.today()

私は自分のコードを取り除き、管理者内からここで基本的な例を試しています

モデル.py

class Test(models.Model):
name = models.CharField(max_length=255,)

def clean(self):
    self.name = 'Robin Hood'
    return self

したがって、新しいテスト レコードを追加しようとするときに、名前フィールドを空のままにしておくと、クリーン メソッドから値を取得して保存する必要があります。

ただし、フォームは検証されず、フィールドは空のままです。

ここで露骨に明らかな何かが欠けていますか?

4

5 に答える 5

8

モデルのcleanメソッドを実行することすらできません。Djangoは最初にフォームの検証コードを実行します。フィールドはで定義されていないためblank=True、フォームは最初にその制約を適用します。

あなたがすべきことは、フォームをオーバーライドrequired=Falseし、nameフィールドに設定してから、 -に値を設定して-を返すフォームself.cleaned_dataクリーンメソッドを作成することです。

class TestForm(forms.ModelForm):
    name = forms.CharField(required=False)

    class Meta:
        model = Test

    def clean(self):
        self.cleaned_data['name'] = 'Robin Hood'
        return self.cleaned_data

管理者クラスでそのフォームを参照します。

class TestAdmin(admin.ModelAdmin):
    form = TestForm
于 2013-01-23T19:43:52.280 に答える
5

clean()オブジェクトが管理サイトから作成された場合、モデルのメソッドは呼び出されません。clean()後にのみ呼び出されfull_clean()ますが、Django 管理サイトの保存とオブジェクトはその関数を呼び出しません。

Mode.clean() の公式ドキュメントでわかるように、full_clean()追加の検証エラーをキャッチするために呼び出されます。

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
    article.full_clean()
except ValidationError, e:
    non_field_errors = e.message_dict[NON_FIELD_ERRORS]

これには save() メソッドをオーバーライドする必要があります。

于 2013-01-23T19:54:48.760 に答える
2

この問題を解決するための 2 つの小さなステップ:)

1) full_clean() は clean() の前に呼び出されるため、models.py で pub_date を次のように設定します。

pub_date = models.DateField(null=True)

2)pub_dateモデルフィールド値を操作するためにclean関数からcleaned_data dictを返すだけです。これを試してください:

def clean(self):
    from django.core.exceptions import ValidationError
    # Don't allow draft entries to have a pub_date.
    if self.cleaned_data['status'] == 'draft' and self.cleaned_data['pub_date'] is not None:
        raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.cleaned_data['status'] == 'published' and self.cleaned_data['pub_date'] is None:
       self.cleaned_data['pub_date'] = datetime.date.today()
    return self.cleaned_data
  • 他の開発者を憐れみ、ValidationErrorをforms.pyファイルの上にインポートするのではなく、時々すべてのクリーンな関数にインポートしてください:)
于 2014-06-23T06:18:40.013 に答える
1

これを試して。クリーニングされたすべてのデータを返す必要があります。blank=Trueまた、まだ行っていない場合は、フォーム フィールドを空白にできるように設定する必要があります。

def clean(self,*args,**kwargs):
    cleaned_data = super(Test,self).clean(*args,**kwargs)

    # Check to see if name is entered, if not set it to robin hood. 
    if not cleaned_data['name']:
        cleaned_data['name'] = 'Robin Hood'

    return cleaned_data
于 2013-01-23T19:55:00.287 に答える