2016-03-25 17 views
1

'daki yüzde cinsinden farkı hesaplayın. Çevrimiçi pazarlama departmanım, pazarlama programlarımıza analitik istatistikleri yükler ve her zaman Excel'de kayıtları tuttuk. Excel'i değiştirmek ve hücreleri vurgulamak ve onlara işlevler eklemek için bir uygulama oluşturdum. Anlayamadığım tek şey, bir sorgudan diğerine farkı hesaplamak ve görüntülemek. Doğru şekilde sormazsam özür dilerim, açıklamaya yardımcı olacak bir resim olarak ekledim. Sonunda benzer nesneleri nasıl hesaplayacağını bilecek bir özel filtre kullanmak istiyorum. Denemek ve araştırmak için baktığım tüm kodlar hala başımın biraz üstünde. Doğru yönde herhangi bir yardım veya itme harika olurdu. Teşekkür ederim. @brandon dediği gibiİki değeri hesaplayın ve Django

Benim Görünüm

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') 
... 

Benim Şablon

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

Ekran enter image description here

+0

İki (veya çok fazla) değeri kabul etmek, karşılaştırmayı yapmak ve şablondaki değeri vermek için bir şablon etiketi yazabilirsiniz. Daha fazla bilgi için https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#writing-custom-template-tags sayfasına bakın. – Brandon

cevap

1

, özelyaratabilir. (Ancak onları çok kullanmamanız gerekir, bu mantık görünümlerde olmalı ve şablonlar sayfa hızını yavaşlatır). Burada durumunda kullanabilir birkaç etiketler şunlardır: öncelikle almak için iki değeri bölmek gerekir sanırım


1. Çoklu filtreleri/etiketler farkı:

@register.filter 
def divide(value, arg): 
    try: 
     return float(value)/float(arg) 
    except (TypeError, ZeroDivisionError): 
     return None 

Ancak özel etiket yerine yerleşik withratio kullanabilirsiniz. Sizin için bir başka yararlı etiket/filtre is_number() dize (veya sayı) bir sayı olabilir test etmek benim özel kod olan percent

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

olduğunu.

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

ve add_color çekebilir: şablonunda

@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) 

gibi bir şey kullanın:

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

Ama bir sorun olabilir çok fazla filtre kullanarak ve ben sadece neyi kodu söyleyemem yapar.


2. Tek filtre/etiket
sadece bir filtre/etiket oluşturmak ve kullanmak gerektiğini olabilir.Şunun gibi: Ben add_color yaptığı gibi

{{l|difference:e|safe}} 

Ya şablon etiketinde şablona veya devre dışı bırakmak autoescape içinde safe kullanın:

@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 

ve şablon içinde yalnızca (Değişkenleriniz için l ve e değiştirin) kullanmak

.

+0

Detaylı yazı için teşekkür ederiz. Buradaki mantığı takip ediyorum, ama uygularken, bazı karakterleri ayrıştırmadım: t_new_sales_2014_wd3 | -t_new_sales_2014_wd2 | | böl: t_new_sales_2014_wd3 | yüzde | tarayıcıda add_color' hatası. Ben hala Python'u öğreniyorum, bu yüzden hatayı nerede bulacağınızdan tam olarak emin değilim ve tarayıcı hatası çok fazla ipucu vermez. –

+0

Şablondan çıkartma izin verilmiyor. Çıkarmak veya yeni oluşturmak için başka bir filtre ekleyebilirsiniz. İhtiyacınız varsa daha sonra bir filtre gönderirim, şu anda zamanım yok. – Lucas03

+0

Teşekkürler, bir süre önce anladım. Bu yüzden görüşte bölümü yapıyorum ama yüzde süzgecini eklemeye çalıştığımda bir 'is_number' tanımlı değil. Floatformat: "2" 'yi şablona doğrudan ekleyebilirim ve işe yarıyor, ancak "yüzde" yi kullanmayı tercih ederim, böylece şablonumu saklayabilir ve tekrar eden koddan temizleyebilirim. Ben de buna dikkat etmeyeceğim, ama 'is_number' tanımlanmış hatasında herhangi bir ipucu varsa, bu yardımcı olur. Şimdiye kadar bu çözüm harika çalışıyor ve bana yeni püf noktaları öğretti. –