2016-08-26 9 views
-1

私は変数querysetを作成して、その値を辞書コンテキスト変数に渡しています。私は日付を変換することができますが、特定のフィールドを通貨(例:1000の代わりに1000ドル)に変換する方法や、特定のフィールドをカンマ(1000ではなく1,000)でヒューマナイズする方法がわかりません。二つの方法は、クラスの一部である:Python/Django djangoビューで特定の辞書項目を変換/ヒューマナイズしますか?

イムは、テーブルを作成する方法
from django.contrib.humanize.templatetags.humanize import intcomma 
intcomma('price') 

、テンプレート:

from datetime import date 

def get_context_data(self): 
    context = super(MyView, self).get_context_data() 
    context['myview_items'] = self.get_mymethod_items_context() 
    return context 

def get_mymethod_items_context(self): 
    context = {} 
    items = table.objects.values('date_begun', 'price', 'item_number') 

    context['items'] = items 
    context['headers'] = ['Date', 'Price', 'Item'] 
    context['fields'] = ['date_begun_date', 'price', 'item_number'] 
    return context 

は私だけ、私は、価格フィールドにやろうとしたものである一つのフィールドを、変換したいですタグ:

{% simple_table_print 'tableid1' 'Price Information' myview_items.items myview_items.fields myview_items.headers %} 
+0

こちらのモデルもここに投稿できますか? – Av4t4r

+0

モデルの関連性はわかりません、それらはすべてCharFieldタイプです – Zorpho

+0

'items'クエリーセットをどのように使う予定ですか?テンプレートに表示したいなら、 '{%load humanize%}'を読み込み、テンプレートタグのように '' intcomma''を使うことができます。書式設定の価格フィールドを持つクエリセットを使用するには、 'Func()'式を使用する必要があります(データベースで許可されている場合)。あるいは、すべての項目に対して 'intcomma'関数をforループで適用することもできます。 –

答えて

0

を使用して非常に簡単な例があります。

from django import template 
from django.contrib.humanize.templatetags.humanize import intcomma 

register = template.Library() 

@register.filter 
def prepend_dollars(dollars): 
    if dollars: 
     dollars = round(float(dollars), 2) 
     return "$%s%s" % (intcomma(int(dollars)), ("%0.2f" % dollars)[-3:]) 
    else: 
     return '' 

は、まず、あなたの中にあなたのcustomtags.pyファイルをロードテンプレート:

{% load customtags %} 

テンプレートで使用することができます:

{{ my_decimal_val | prepend_dollars }} 

希望します。

+0

私はテンプレートにhumanizeを使用するつもりはなく、私は自分のテンプレートの辞書としてすべてのフィールドを呼び出しているので、テンプレートに入る前にビューで変換したいと思っています。 – Zorpho

+0

Pythonで 'prepend_dollars'メソッドテンプレートで使用したくない場合は、コードを表示してください。 – user4426017

1

可能であれば、あなたの通貨価値にはdecimal fieldを使用する必要があります。これはdjangoの規約ではありません。it's a general programming one; 10進数の型は、有効な "金額"表現に必要な精度を保持できます。

the documentationと指摘されているように、humanizeアプリをインストールし、テンプレートに{% load humanize %}をロードする必要があります。 は、settings.pyで提供されている適切なロケールを使用します。

Hereあなたは私がhumanizeアプリをインストールしてから、自分のtemplatetagを作成するために、そのintcomma方法を延長する{% load humanize %}

+0

私は前にhumanizeを使っていましたが、これはすべてのフィールドについてですが、私はこれをsepecifcフィールドにのみ行いたいと考えています。私は私の質問を更新して、私が何を意味するのかをさらに説明します。 – Zorpho

0

通常、支払い処理の頭痛です。あなたは、フィルタとして、あるいは、あなたにそれを使用することができます

from decimal import Decimal 
from decimal import InvalidOperation 

from babel.numbers import format_currency 
from django.utils.translation import get_language, to_locale 


@register.filter 
def currency_format(value, currency = 'USD'): 
    try: 
     value = Decimal(value) 
    except (TypeError, InvalidOperation): 
     return u''   

    kwargs = { 
     'currency': currency, 
     'locale': to_locale(get_language() or settings.LANGUAGE_CODE) 

    return format_currency(value, **kwargs) 

:次のフィルタを実装するベース&として

使用'babel'アプリ:あなたの通貨値をローカライズしたい場合はしかし、私はそのようなSTHをお勧めしたいです再生回数はcurrency_format()です。

関連する問題