2013-07-15 25 views
6

Bu yüzden bir harcama sayfası django uygulaması yapıyorum ve tüm girilen masrafların toplamını oluşturmaya çalışıyorum.django şablonlarında özel yönetici işlevini çağırma

Ben toplamını hesaplamak için özel bir yöneticisi oluşturduk:

class ExpenseManager(models.Manager): 
    def price_sum(self): 
    return super(ExpenseManager, self).aggregate(total_price = Sum('price'))['total_price'] 

Ve modeline eklemiş:

class Expense(models.Model): 
    ... 
    objects = models.Manager() 
    price_object = ExpenseManager() 
    ... 

ben kabuğunda yürüttüğünüzde çünkü benim yöneticisi çalıştığını biliyorum Harcamalarımın doğru toplamını aldım - yani Expense.price_object.price_sum()'u koydum ve Decimal('254.77')'a geri dönüyorum - ama bunu şablonuma getirmeye çalıştığımda boş görünüyor.

örneğin, benim değişkeninde birkaç farklı yollar koyarak denedim ama hiçbiri çalıştı:

{{price_object.price_sum}} 

veya

{{expense.price_object.price_sum}} 

ya da beni umutsuz durumda ...

{% for p in expense.price_object %} {{p.price_sum}} {% endfor %} 

veya

{% for p in expense.price_object.price_sum %} {{p}} {% endfor %} 

ama evet ... sayfayı yüklediğimde hiçbir şey görünmez. Biri yardım edebilir mi?

cevap

1

böyle yönetici yöntemini tanımlamak için deneyin:

class ExpenseManager(models.Manager): 
    def get_expenses(self): 
     return super(ExpenseManager, self).get_query_set().aggregate(total_price = Sum('interval'))['total_price'] 

Sadece denedim ve bu benim için bir şablonda toplamı hesapladık.

+0

Şablonda nasıl çağırdınız? – sha256

+0

@ sha256, Daniel Roseman'ın yanıtında olduğu gibi, şablona bir Model sınıfı nesnesi iletmeniz yeterlidir. Her iki monitöre de – dragoon

+0

+1. yararlı – sha256

1

Şablon örneklerinden hiçbiri kabuğunda yaptığınız öğeye eşdeğer gibi görünmüyor. Kabukta, yöneticiyi model sınıfı Expense'dan doğru bir şekilde çağırdınız. Bu da şablondan yapman gereken şey. Bunu bir model örneğinden, yalnızca sınıftan çağıramazsınız ve var olan expense adının bir örnek olduğunu varsayalım. Şablon içeriğine sınıfının kendisini iletmeniz gerekecek.

+0

Üzgünüm, bu temel ise, ancak sınıfın kendisini nasıl geçersiniz? Şu anda benim görüşüme göre "all_expenses = Expense.objects.all()" ifadesini "{'giderleri': all_expenses}" olarak değiştirdim (değişkeni giderlerden gider olarak değiştirdim, çünkü masraf yerine tek tek gider Yani bu, yukarıda paylaştığımla karşılaştırıldığında bir sorun değil) – skscharr

+0

Bir sınıf, başka bir şey gibi bir nesnedir. Tam olarak aynı şekilde iletebilirsiniz: '{'Gider': Gider]. –