4

Django で課金システムを作成していますが、奇妙な問題が発生しています。私の views.py で、支払いが行われた一意の月を引き出すクエリを作成します。次に、この月のリストを反復処理して、毎月支払われた金額を計算します。

クエリは機能し、計算された数値は正しいのですが、テンプレートで表示すると 1 か月ずれています。そのため、クエリを実行すると 6 月の合計が得られますが、テンプレートでは月が 5 月として表示されてしまいます。これを機能させるための簡単なハックを作成するのは簡単ですが、なぜこれが起こっているのかを理解したいと思います.

以下のコード:

# views.py

def reports_index(request):
    payment_months = Payment.objects.dates('date', 'month')
    payments_by_month = []
    for p in payment_months:
         monthly_payment = Payment.objects.filter(date__year=p.year, date__month=p.month).aggregate(Sum('amount'))['amount__sum']
         yearly_payment = monthly_payment * 12
         payments_by_month.append([p, monthly_payment, yearly_payment])

    return render_to_response('reports.html', locals(), context_instance=RequestContext(request))


# reports.html

{% load humanize %}

<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic resize">
        <thead>
            <tr>
                <th>Month</th>
                <th>Monthly Payments Recieved</th>
                <th>Yearly Payment Estimate</th>
            </tr>
        </thead>
        <tbody>
            {% for p in payments_by_month %}
                <tr class="gradeC">
                    <td>{{ p.0|date:"M Y" }}</td>
                    <td style="text-align:center;">${{ p.1|intcomma }}</td>
                    <td style="text-align:center;">${{ p.2|intcomma }}</td>
                </tr>
            {% endfor %}

        </tbody>
     </table>

誰かが前にこのようなものを見たことがありますか?

4

1 に答える 1

3

クリッキー!少しの助けで、私は自分の質問に対する答えを見つけたようです。

@esauro は、{{ p.0|date:"M Y" }} の代わりに {{ p.0.month }} をチェックすることを提案したので、これはすべて彼に触発されたものです。

{{ p.0.month }} = 6

{{ p.0|date:"M Y" }} = 2012 年 5 月

この不一致の理由は、私の settings.py がタイム ゾーン情報を使用しており、私が米国にいるためです。これにより、GMT から数時間遅れて前日に移動します。したがって、2012 年 6 月を期待していた 2012 年 5 月です。デフォルトの Django 設定は次のとおりです。

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

設定した場合:

USE_TZ = False

次に、タイムゾーンを意識した日時を取得しません。フォローアップの質問をすると、これは sqlite でのみ発生しますか? 私は開発サーバーを実行しているだけですが、これが開発と本番の間で変わる可能性があることに気づきませんでした。

これは、今まであまり評価できなかったものです。DB には、独自の日付と時刻の構造があります。また、Django ORM にはマッピングがありますが、Django の設定によって異なります。TZ 設定の小さな変更は、以前は固定されていると思っていたものに大きな影響を与える可能性があります。

お役に立てれば。

于 2012-12-04T04:31:45.837 に答える