2016-04-05 29 views
1

birden fazla nesneyi gösteriliyor ve bir sorum var. Belki I.Son zamanlarda Django CBV uğraşmaya edilmiş bir DetailView

Bir havayolu rezervasyon CRM uygulaması vardır varsayalım daha daha iyi fikirler var ve ben çeşitli şeyler için bir müşteri bir görüntüsünü gerçekleştirmek niyetinde. Ben Booking, Rating, Customer_Service_Calls, Favourited_Route gibi Customer için, Models bir listesi var varsayalım. Verilen Şimdi

, Django'nın CBV tarafından uygulanan bir DetailView, böyle bu

class CustomerThreeSixtyView(DetailView): 
    model = 'Customer' 

    def get_context_data(self, **kwargs): 
     context = super(CustomerThreeSixtyView, self).get_context_data(**kwargs) 
     context['bookings'] = Booking.objects.all.filter(customer_id=request.kwargs['pk'] 
     context['ratings'] = Ratings.objects.all.filter(customer_id=request.kwargs['pk'] 
     context['calls'] = Customer_Service_Calls.objects.all.filter(customer_id=request.kwargs['pk'], status'Open') 
     context['fav_routes'] = Favourited_Route.objects.all.filter(customer_id=request.kwargs['pk'], status'Open') 
     return context 

Something gibi bir şey var. Sorum şu, bunu yapmanın daha iyi yolları var mı? Bu en basit yoldur, ancak bir şeylere bağlı gibi görünmesi nedeniyle öneriler istemiyorum. Ne yaptın

+0

gibi diğer sınıflar için aynı yaklaşımı kullanabilirsiniz, kendi bakış sınıfına 'context_object_name = 'customer'' ayarlayın ve sonra başvurmak üzere şablonda yol. Her zaman 'müşteri' nesnesine 'nesne' olarak başvurmak istemiyorsanız yararlı olur. Mevcut uygulamanın yeterli göründüğü – spiffyman

cevap

3

zaten yeterince iyi görünüyor. Bu bağlamda istediğiniz şeyi alıyorsunuz ve sonra bilgiyi göstermek için şablonda kullanıyorsunuz.

: Rezervasyonum'a müşterisini bağlarken sen related_name kullanırsanız

{% for booking in object.booking_set.all %} # object is the customer here 
    # do what you want to do with the booking here 
{% endfor %} 

Hatta daha iyidir:

Alternatif olarak, doğrudan bağlam içinde belirtmeden şablonda belirli bir müşteri için rezervasyon erişebilecek

:
class Booking(models.Model): 
    customer = models.ForeignKey(Customer, related_name='bookings') 
    # other fields 

Şimdi, doğrudan belirli bir müşteri için rezervasyon erişmek için tanımlanan related_name kullanabilirsiniz

Ve, vb Rating, Customer_Service_Calls, Favourited_Route bir kenara olarak

+0

+1. Sadece dikkatli bir not, ancak: bu o ORM * Gerçek sorgulara şablon kurşun çağrıları unutmak kolaydır *; Siz ya da başka bir devir daha sonra bunları kötüye kullanabilir ve performans sorunlarına neden olabilir. ve başka bir şey - hatta belki de yerine 'QuerySet' ait bir şeye dönüştü - Daha İyi IME sadece gerekeni şablonu vermek. – spiffyman

+0

@spiffyman Teşekkür ederim. Ben kendim bağlamda gerekli olanı ayarlamayı tercih edeceğim, böylece ona birçok kez ve birden çok şekilde erişmek istiyorum. Bu sadece bir alternatif öneriydi (_since kullanıcı sordu). Öte yandan, nesnelere (Queryset haricinde) dönüştürmeyi ne önerirsiniz? – AKS

+0

evet! tamam var, 'related_name' kullanarak çok daha yararlı :) Bu harika! Daha fazla güveniyorum 'DetailView' buradan yazıyor! – bryansis2010

İlgili konular