2016-07-25 6 views
1

CreateViewに提出された値を前処理して検証する必要があります。たとえば、フォームに入力された文字列のカスタムint-parserです。その後、私のモデルに保存されます(既存の関数parse_laptime付き)整数に:私は「54.363 1」:のようなCreateViewフォームに入力した文字列を変換したい私の場合はCreateViewに渡された値を事前処理する方法

class Lap(models.Model): 
    laptime = models.IntegerField(default=0) 

どのようにこれを最高に達成できるのでしょう私はDjangoを初めて使用しており、上書きされたcleanメソッドのカスタムフォームを使用しようとしましたが、フィールドは事前に検証に失敗し、clean()に渡されません。

+0

試したコードを表示してください。 – Alasdair

答えて

1

私はあなたのデータを検証するためにフォームを使用する正しい軌道にいると思います。ただし、時間の値としてフォーマットされた入力データがモデルに必要な整数ではないため、入力が検証テストに失敗しています。

入力されたデータを受け入れるフォーム(またはバインドされていないフォーム)を、文字フィールドとして使用する必要があります。次に、このバインドされていないフィールドにクリーンメソッドを使用して、データを(フォーマットおよび/または値に基づいて)変換できることを確認します。実際の変換は、おそらくform_valid()メソッドのビューロジックで行われます。

1

ラップタイムは時間であり、あなたは、ユーザーがフォーマット「1:54.363」でそれを入力することを期待する場合に使用する権利フィールドはTimeField

で与えられた値がdatetime.timeのかのどちらかであることを検証します文字列 は、特定の時刻形式でフォーマットされています

これは、データベースにマイクロ秒で格納されているようです。その後、form.is_valid()メソッドをチェックし、日付時刻関数または分割と算術を使用して変換を行う必要があります。 。

+0

私が理解しているところから、TimeFieldは、ラップタイムのような絶対時間ではなく、時刻を表します。 TimeFieldも24時間に制限されています。しかし、時刻を書式設定して保存する場合は、正しいです。 –

+0

さて、私はちょうど私が必要としているDurationFieldがあると思いました。 DurationFieldをサブクラス化することでこの問題は解決しましたが、本当にその質問には答えません。 –

関連する問題