2013-04-02 21 views
6

Django şablonunda her zaman değişkenimin pozitif değerini kullanmak istiyorum.Django şablonunda -1 ile çarpma

Elbette
{% if qty > 0 %} 
    Please, sell {{ qty }} products. 
{% elif qty < 0 %} 
    Please, buy {{ -qty }} products. 
{% endif %} 

, {{ -qty }} çalışmaz: değişkenin işareti sadece metinsel anlamıdır.

Mutlak değer içeren ikinci bir değişkeni geçmeden bir geçici çözüm var mı? Değeri işaretsiz bir tam sayıya dönüştüren şablon filtresi gibi bir şey.

Teşekkürler!

cevap

11

Bazı dize filtreleri kötüye kullanabilirler:

{% if qty > 0 %} 
    Please, sell {{ qty }} products. 
{% elif qty < 0 %} 
    Please, buy {{ qty|slice:"1:" }} products. 
{% endif %} 

veya

Please, sell {{ qty|stringformat:"+d"|slice:"1:" }} products. 

Ama sen görünümünde bunu veya özel filtre yazma muhtemelen gerekir.

+0

Teşekkürler, aradığım şey bu gibi görünüyor! Özel bir filtre kullanabilirdim (ama Django'nunkileri "kötüye kullanmayı" tercih ederim), ama daha fazla bir şey yapma fikrini beğenmiyorum. Benim düşünceme göre, görünüm zaten mantığı yapıyor, ve metinsel anlamını oluşturmak için şablonun işi (ve belki de her iki durum için farklı HTML kodu istiyorum). Ayrıca, bir sayının işaretini göstermemek sadece hesaplamalar değil, biçimlendirmelerdir. Ama ne yazık ki, 'stringformat ':' u '' bunu kullanamayız. – alexpirine

1

İdeal görüntülenmesinden ayrı mantığına, senin görünümünde kontrolü gerçekleştirmek olacaktır (örneğin, adet = 0? Ne olur) şablonda matematik yapmakta ısrar ederseniz, this hack gibi bir şey yapabilirdi.

Başka bir seçenek, özel bir filtre yazmaktır (bkz. this example).

+0

vaka 'qty = 0', elbette, orijinal şablona dahil değil basitlik uğruna burada gösterilen. Benim görüşüme göre daha fazla yazı yazma fikrinden hoşlanmıyorum, çünkü bu mantığı yapar ve sonuçları çok özlü bir şekilde iletir.Yarın her iki durum için farklı HTML stili kullanmak istiyorsam, bunun görünmesi gerektiğini düşünmüyorum! – alexpirine

+0

Yeterince adil. Bu durumda, diğer cevapların bir kısmı önerdiğinden, kendi şablon filtrelerinizi yazmanızı öneririm. Sadece birkaç satırlık kod alır ve bu işlevin tüm şablonlarınızda uygulanmasını kolaylaştırır. – Basti

4

Bunun için özel bir filtre kullanmalısınız. , Şablonunuzdaki Sonra

# negate_filter.py 
from django import template 
register = template.Library() 

@register.filter 
def negate(value): 
    return -value 

üstüne kodu {% load negate_filter %} ekleyebilir ve daha sonra {{ qty|negate }} ile {{ -qty }} değiştirin:

1) Bir negate filtre tanımlayabilirsiniz:

İşte bunu yapmak için iki farklı yol var .

2) Eğer isterseniz, aynı zamanda bir buy_sell filtreli tüm şey değiştirebilirsiniz:

# buy_sell_filter.py 
from django import template 
register = template.Library() 

@register.filter 
def buy_sell(value): 
    if value > 0 : 
     return 'sell %s' % value 
    else : 
     return 'buy %s' % -value 

Sonra şablon sadece

{% if qty %} Please, sell {{ qty|buy_sell }} products.{% endif %} 

Hatta tüm dize içerebilir olmalıdır filtrede ve sadece şablonun tamamı {{qty | buy_sell}} olabilir.

Her iki seçenek de şablonunuzun geri kalanına bağlı olarak uygundur. Örneğin, negatif satın almak ve pozitif için satmak çok sayıda dizeleri varsa, ikincisini yapın.

2

Python'da everything'da olduğu gibi, bunun için bir kitaplık vardır: django-mathfilters.

Sonra sadece böyle abs filtreyi kullanabilirsiniz:

Please, sell {{ qty|abs }} products.