ショッピングカートアプリ用の最初のdjango eコマースアプリケーションを使用しています。カートに追加ボタンをクリックすると、上記のエラーが発生します。
行でエラーが発生しています{{ cart_sutotal|currency}}
ショッピングカートアプリ用の最初のdjango eコマースアプリケーションを使用しています。カートに追加ボタンをクリックすると、上記のエラーが発生します。
行でエラーが発生しています{{ cart_sutotal|currency}}
その本を覚えています... カスタム テンプレート フィルターを作成しているのですね。locale.currency
渡される値を文字列からint
/ decimal
/に変換する必要がありますfloat
。
通貨の丸め誤差を回避するためのベスト プラクティスは、decimal
パッケージを使用することです。decimal パッケージをインポートし、値をDecimal
関数に渡して問題を修正します。
from decimal import Decimal
value = Decimal(value)
したがって、コードは次のようになります。
from django import template
import locale
from decimal import Decimal
register = template.Library()
@register.filter(name='currency')
def currency(value):
try:
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
except:
locale.setlocale(locale.LC_ALL,'')
value = Decimal(value)
loc = locale.localeconv()
return locale.currency(value, loc['currency_symbol'], grouping=True)
フィルタは、そのcurrency
引数が数値であることを想定しています。としてテンプレートに文字列を渡していますcart_sutotal
。
テンプレートに渡す前に、decimal.Decimal に変換するか、価格値を合計して小計の文字列を作成する理由を理解することをお勧めします。
python docsから。
abs()
数値の絶対値を返します。引数は、プレーンまたは long 整数または浮動小数点数です。引数が複素数の場合、その大きさが返されます。
発生したエラーは、上記の引数の選択が期待されるメソッドにstr
引数を渡していることを示唆しています。解決策は、オブジェクトを abs メソッドabs()
に明示的に渡すことです。integer
>>>number = "1"
>>>print abs(int(number))
1
>>>
「Django Eコマースの始まり」の本からコードを書いていると思います。エラーは、 の{{ cart_sutotal|currency }}
代わりに記述したコードにあります{{ cart_subtotal }}
。
コードのどこかにキャストがありません。コード内のどこでも、 を実行しabs(somevar)
て文字列を整数にキャストする必要がありますabs(int(somevar))
。スタックトレースまたはコードを投稿する場合は、詳細情報。