16

私のジャンゴの本は大学に戻ってきたので、これを解決するのに苦労しています。

私はdjango.forms.widgets.MultiWidget次のようにサブクラス化しました:

class DateSelectorWidget(widgets.MultiWidget):
    def __init__(self, attrs=None, dt=None, mode=0):  
        if dt is not None:
            self.datepos = dt
        else:
            self.datepos = date.today()    

        # bits of python to create days, months, years
        # example below, the rest snipped for neatness.

        years = [(year, year) for year in year_digits]

        _widgets = (
            widgets.Select(attrs=attrs, choices=days), 
            widgets.Select(attrs=attrs, choices=months),
            widgets.Select(attrs=attrs, choices=years),
            )
        super(DateSelectorWidget, self).__init__(_widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.day, value.month, value.year]
        return [None, None, None]

    def format_output(self, rendered_widgets):
        return u''.join(rendered_widgets)

これにより、次のような気の利いた日付選択フィールドが表示されます。 気の利いた日付選択のこと

私の質問は本当にとても簡単です。上記のフォームをその処理方法に送信すると(次のようなプロセスを使用します:

forminstance = ModelNameForm(request.POST, instance=modelinstance)
    if forminstance.is_valid():
        forminstance.save()

これは失敗します。Django は、私のマルチウィジェットを取得して、それを に設定されている基礎となるフィールド タイプに変換する方法を認識していないためmodels.pyですDateField()

ここで、django ソースの MultiWidget に関するコメントから、次の役立つヒントが得られます。

おそらく、このクラスを MultiValueField と一緒に使用したいと思うでしょう。

しかし、問題は - 私はおそらくそうではありません。DateField()とても便利で、複製しても意味がないので、手元に置いておきたいと思います。yyyy-mm-dd次に、データベースに挿入するために、これらの複数のフィールドを単一の有効な日付文字列 ( ) に変換する必要があります。

私の質問は次のとおりです。

どのように?これを達成するための最良の方法は何ですか?

4

1 に答える 1

12

私自身の質問に答えました!

私はこの方法を実装しました:

def value_from_datadict(self, data, files, name):
    datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) \ 
                                      for i, widget in enumerate(self.widgets)]
    try:
        D = date(day=int(datelist[0]), month=int(datelist[1]), \
             year=int(datelist[2]))
        return str(D)
    except ValueError:
        return ""

value_from_datadict ポストdatadict全体からすべてのサブウィジェットのデータを引き出します。私が行ったことは、さまざまな日付の対応物を抽出し、日付コンストラクターを使用して日付を検証することです。有効な場合は文字列を正しい形式で出力し、そうでない場合は空の文字列を返します。

forminstance.is_valid()

キャッチします。

これをするとき、私はそれが大好きです!

于 2011-01-11T23:38:36.497 に答える