Arkadaşlar birçok işlemi yaptım. Sadece admin panelde tablodaki satırların fiyat toplamını altta yazdırmak istiyorum filtreye göre. Ve bu tabloyu pdf e aktarmak istiyorum. Yardımcı olur musunuz?
Selam, tabloyu dolduran sql sorgusuna sum(toplam) as toplam_fiyat gibi bi ekleme yapıp, bu kolonu sayfanın htmlinde ilgili yere yerleştirebilirisiniz. Bu tabi eğer siz yapacaksanız, muhtemelen kullandığınız grid yapısı zaten bunu sağlıyordur. Gridi tanımlarken toplam kolonu için ayrıca sum özelliği tanımladığınızda toplamı altta gösterecektir.
Hocam admin panel olduğu için template değiştirmem lazım. Template değiştirmeden bu işi nasıl yapabilirim? Bir de admin panelde sağ tarafta filtreler var. Bu filkreleri uyguladığımda total değişmesi lazım. Bir tane örnek yaptım ama çekilen verilerin tamamını topluyor. Email atsam projeyi bakar mısın?
Yok mu forumda uzman bir arkadaş ? Admin panelde filtreleme yaptığımda total price değişsin tablonun altında. Bir de tablonun altında pdf yazdır butonu istiyorum tabloyu PDF e kaydedecek. Admin panelde istiyorum. Normal html de yaparım view ile zaten. HTML sayfalarıyla uğraşmak istemiyorum.
Ücretli de olabilir.
Admin Panelini Özelleştirme:
admin.py dosyası:
from django.contrib import admin
from django.db.models import Sum
from .models import Stok # Modelinizi import edin
class StokAdmin(admin.ModelAdmin):
list_display = ('author', 'hasat_sezonu', 'musteri_adi', 'urun_adi', 'miktar', 'miktar_turu', 'toplam', 'kasa_tipi', 'alis_tarihi')
def changelist_view(self, request, extra_context=None):
# Toplamı hesapla
toplam = Stok.objects.aggregate(total=Sum('toplam'))['total']
# Ekstra bağlam ekle
extra_context = extra_context or {}
extra_context['toplam'] = toplam
return super().changelist_view(request, extra_context=extra_context)
Toplamı Admin Panelinin Altında Gösterme
templates/admin/app_adiniz/model_adiniz/change_list.html
dosyasını oluşturun ve aşağıdaki gibi düzenleyin:
{% extends "admin/change_list.html" %}
{% block result_list %}
{{ block.super }}
<table>
<tfoot>
<tr>
<td colspan="7" style="text-align:right; font-weight: bold;">
Toplam: {{ toplam }}
</td>
</tr>
</tfoot>
</table>
{% endblock %}
`
Kodu test etmedim ama buna benzer daha önce bir yapıyı kendi projemde kullanmıştım. Bir hata olursa debug ederek yada hata kodlarına bakarak ilerleyebilirsiniz.
Teşekkür ederim normal html sayfasinda toplamları gösteriyorum. Dediğinizi yapacağım ama admin panelde sağ tarafta filtreler var. Filtre uyguladigimda toplam degisecek mi ondan emin değilim. Sizin yazmış olduğunuz koda göre tüm kayıtların toplamını alıyor galiba.
O zaman bu sekilde bir değişiklik iş görecektir.
def changelist_view(self, request, extra_context=None):
# Admin panelindeki filtrelenmiş sorguyu al
queryset = self.get_queryset(request)
# Toplamı hesapla (filtrelenmiş verilere göre)
toplam = queryset.aggregate(total=Sum('toplam'))['total'] or 0
# Ekstra bağlam ekle
extra_context = extra_context or {}
extra_context['toplam'] = toplam
return super().changelist_view(request, extra_context=extra_context)
İlk yazdığınız kodu ekledim süper çalışıyor. Yalnız querysete göre gönderdiğiniz toplam değeri değişmiyor maalesef. Tüm kayıtların toplamını getiriyor.
Resimde filtreleme yaptım ama tüm kayıtların toplamını gösteriyor.
Şöyle bir çözüm buldum. Ama requestten customer değeri gelmiyorsa filterda customer yazan yere all demem lazım. Tabi diğer parametrelere de. Çok kombinasyon var
product = request.GET.get('product__pk__exact') or ""
season= request.GET.get('season__pk__exact') or ""
customer = request.GET.get('customer__pk__exact') or ""
buysell = request.GET.get('buysell__exact') or ""
toplam = queryset.filter(customer_id=**customer**).aggregate(total=Sum('price'))['total'] or 0
- Sorun
Tüm modellerde toplamın gözükmemesi için admin template yolunu dogru girmelisiniz.
templates/admin/appname/stok/change_list.html
(buradaappname
, uygulamanızın adı)
Eğer sorun devam ederse: Şablon klasörünün dogru yolu gösterdiğinden emin olun.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / "templates"], # Şablon klasörünüzün yolu
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- Sorun
Filtrelemeye göre dogru sonucun göserilmes için bu kod işe yaramalı. Test etmedim.
class StockAdmin(admin.ModelAdmin):
list_display = ('buysell', 'season', 'customer', 'product', 'quantity', 'quantityType', 'toplam', 'date')
list_display_links = ('buysell', 'season', 'customer', 'product', 'quantity', 'quantityType', 'toplam', 'date')
list_filter = [StockFilter, StockSeasonFilter, StockCustomerFilter, StockQuantityFilter, 'buysell', 'date']
autocomplete_fields = ('season', 'customer', 'product', 'quantityType')
def changelist_view(self, request, extra_context=None):
# Mevcut queryset'i filtrelemelere göre alın
queryset = self.get_queryset(request)
# Toplamı hesapla
toplam = queryset.aggregate(total=Sum('toplam'))['total'] or 0
# Ekstra bağlam ekle
extra_context = extra_context or {}
extra_context['filtered_total'] = toplam # Filtrelenmiş toplam
return super().changelist_view(request, extra_context=extra_context)
HTML Şablonuda buna göre bu şekilde değişirse daha açık olur: {{ filtered_total }}
{% extends "admin/change_list.html" %}
{% block content %}
{{ block.super }}
<div class="total-summary" style="margin-top: 20px; font-weight: bold; text-align: right;">
<p>Filtrelenmiş Toplam: {{ filtered_total }}</p>
</div>
{% endblock %}
Request’ten query parametleri ile algılayarak ilerlemeye çalışıyorsunuz ama buna gerek yok çünkü sizin yapmış oldugunuz filtrelere göre queryset yapısı otomatik filtrelenerek gelmeli. Tam kodu bana email vs iletin kodu debug ederek ilerleyelim.
Mevcut queryset’i filtrelemelere göre alın
queryset = self.get_queryset(request)
queryset = self.get_queryset(request)
buna göre toplamı güncellemiyor. if ile 15 tane farklı senaryo yazmam lazım 4 parametre için hesapladım
Şöyle çalışıyor ama 15 e çıkarmam lazım. Filtrelemede 4 parametre var. 15 farklı kombinasyon oluşuyor.
queryset = self.get_queryset(request)
product = request.GET.get('product__pk__exact') or ""
season= request.GET.get('season__pk__exact') or ""
customer = request.GET.get('customer__pk__exact') or ""
buysell = request.GET.get('buysell__exact') or ""
# Toplamı hesapla (filtrelenmiş verilere göre)
if product=="" and season=="" and customer=="" and buysell=="":
toplam = queryset.aggregate(total=Sum('price'))['total'] or 0
elif product=="" and season=="" and buysell=="":
toplam = queryset.filter(customer_id=customer).aggregate(total=Sum('price'))['total'] or 0