ショッピングカートアプリ用の最初の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))。スタックトレースまたはコードを投稿する場合は、詳細情報。