2016-03-25 13 views
1

私のオンラインマーケティング部門はマーケティングプログラムに関する分析統計をアップロードしています。私は、Excelに置き換えて、セルを強調表示するアプリケーションを構築し、それらに関数を追加するのは簡単でした。私が理解できない唯一のことは、あるクエリから別のクエリへの違いを計算して表示する方法です。私が正しく質問していないのであれば、私はお詫び申し上げます。最終的には、同様のオブジェクトを計算する方法を知るカスタムフィルタを使用したいと考えています。試してみるために私が見たすべてのコードはまだ私の頭の上に少しです。どんな援助や正しい方向へのプッシュもすばらしいでしょう。ありがとうございました。Djangoで2つの値を計算し、パーセンテージの差を計算する

マイビュー

t_2014 = traffic.filter(created__year='2014') 
... 

wd1 = t_2014.filter(created__week_day=1).aggregate(Sum('sessions'), Sum('new_users'), Sum('reminder'), Sum('campaigns'), Sum('new_sales'), Sum('sales_renewals')) 
wd2 = t_2014.filter(created__week_day=2).aggregate(Sum('sessions'), Sum('new_users'), Sum('reminder'), Sum('campaigns'), Sum('new_sales'), Sum('sales_renewals')) 
... 

t_new_sales_2014_wd1 = wd1.get('new_sales__sum') 
t_new_sales_2014_wd2 = wd2.get('new_sales__sum') 
... 

マイテンプレート

<td>{{ t_new_sales_2014_wd1 }}</td> 
... 
<td>{{ t_new_sales_2014_wd2 }}</td> 
... 

スクリーンショット enter image description here

+0

2つ(または多くの)値を受け入れるテンプレートタグを作成し、比較してテンプレートの値を出力することができます。詳細については、https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#writing-custom-template-tagsを参照してください。 – Brandon

答えて

1

@brandonは、カスタムを作成することも、言ったように。 (しかし、あなたはそれらをたくさん使ってはいけません。このロジックはビューになければならず、templatetagsはページ速度を遅くします)。私が最初にあなたが違いを取得するために両方の値を分割する必要があり、推測


1.複数のフィルタ/タグ

@register.filter 
def divide(value, arg): 
    try: 
     return float(value)/float(arg) 
    except (TypeError, ZeroDivisionError): 
     return None 
ここ は、あなたがあなたのケースで使用する可能性があるいくつかのタグです

カスタムタグの代わりに、組み込みのwithratioを使用することができます。 あなたのための別の有用なタグ/フィルタはis_number()が文字列(または番号)数とすることができるかどうかをテストするために私のカスタムコードをあるpercent

@register.filter 
def percent(value): 
    if not is_number(value): 
     return None 
    return floatformat(Decimal(value) * Decimal(100.0), 2) + '%' 

です。

def is_number(s): 
    try: 
     float(s) 
     return True 
    except (ValueError, TypeError): 
     return False 

add_colorことがありますテンプレートで

@register.filter(needs_autoescape=False) 
def add_color(value): 
    if float(value) > 0: 
     return '<font color="#28a901">%s</font>' % value 
    elif float(value) < 0: 
     return '<font color="#f63434">%s</font>' % value 
    else: 
     return str(value) 

だけのようなものを使用します。

{{ t_new_sales_2014_wd1|add:-t_new_sales_2014_wd2|divide:t_new_sales_2014_wd2|percent|add_color }} 

しかし、あまりにも多くのフィルタを使用すると問題があるかもしれないと私は単純にどのようなコードを伝えることはできませんそうです。


2.シングルフィルタ/タグ
はあなただけで一つのフィルタ/タグを作成し、それを使用する必要がありますように。

@register.filter 
def difference(value, arg): 
    try: 
     result_num = (float(arg) - float(value))/(float(arg) * 0.01) 
     if result_num > 0: 
      result = '<font color="#28a901">%s%%</font>' % result_num 
     elif result_num < 0: 
      result = '<font color="#f63434">%s%%</font>' % result_num 
    except (TypeError, ZeroDivisionError): 
     return None 
    return result 

とテンプレートでちょうど(あなたの変数のためのleを置き換え)を使用します:どちらか一方

{{l|difference:e|safe}} 

私はadd_colorに行ったようにテンプレートタグでテンプレートまたは無効autoescapeでsafeを使用してこのように。

+0

詳しい投稿ありがとうございます。私はここでロジックに従っていますが、それを実装するときに、 'いくつかの文字を解析できませんでした:t_new_sales_2014_wd3 | -t_new_sales_2014_wd2 | |分割:t_new_sales_2014_wd3 |パーセント|ブラウザで「add_color」エラーが発生しました。私はまだPythonを学んでいるので、エラーを特定する場所とブラウザのエラーがあまりにも多くの手がかりを与えていないことを正確には分からない。 –

+0

テンプレートの減算は許可されません。減算または新しいフィルタを追加することができます。後でフィルターが必要になったら、私はあなたに投稿します。私は今は時間がありません。 – Lucas03

+0

ありがとう、私はそれを考え出した。だから私はビュー内の除算を行っているが、 '%'フィルタを追加しようとすると 'is_number'が定義されない。私は 'floatformat:" 2 "'をテンプレートに直接追加して動作させることができますが、 '%'を使うのでテンプレートとビューを繰り返しコードからきれいに保つことができます。私はそれを打ちのめすつもりですが、 'is_number'定義されていないエラーの手がかりがあれば、それは助けになります。これまでのところ、このソリューションはすごくうまくいっていて、私にいくつかの新しいトリックを教えてくれました。 –

関連する問題