Django Sınıf görünümleri

oy
48

Django Eğer işlevsellik sadece biraz değiştirmek istiyorsanız bir sorun olabilir bir fonksiyonu için görünüm noktaları. Evet, milyon kelime argümanları ve olabilir hatta daha eğer işlev ifadeleri, ancak bir nesne yönelimli yaklaşımın düşünüyordum.

Örneğin, ben bir kullanıcı görüntüleyen bir sayfa var. Bu sayfa bir grup görüntüler sayfaya çok benzer, ama sadece başka bir veri modeli kullanmak için hala çok benzer değil. Grup ayrıca üye vs var ...

Tek yönlü sınıf yöntemlerine görüşlerini işaret ve sonra bu sınıf genişletmek olacaktır. Herkes bu yaklaşımı denedik ya da başka bir fikri vardır mı?

Oluştur 03/08/2008 saat 16:55
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
41

Yarattığım ve tanımlayan kendi jenerik görünüm sınıfları kullandım __call__böylece sınıfının bir örneğidir çağrılabilir. Gerçekten beğendim; Django'nın jenerik görünümler anahtar kelime argümanlar aracılığıyla bazı özelleştirme izin ederken, (onların davranışları ayrı bir takım yöntemler ayrılıyorsa) OO jenerik görünümleri beni daha az kendime çok tekrarlamak sağlayan subclassing yoluyla çok daha ince taneli özelleştirme olabilir. (Ben Django'nın jenerik görünümleri oldukça izin vermediğimiz bir çimdik gerekir aynı / güncelleme oluşturmak görünüm mantık her zaman yeniden yazma sıkılıyorum).

Ben bazı kod gönderdiniz djangosnippets.org .

Görmek tek gerçek olumsuz bir şekilde performansını etkileyebilecek iç yöntemine aramaların çoğalmasıdır. Bu önemsiz bir şey olduğunu düşünmüyorum; Python kod yürütme bir web uygulamasında performans engel olacağını nadirdir.

GÜNCELLEME : Django kendi jenerik görüşleri artık sınıf tabanlıdır.

GÜNCELLEME : Bu yanıt yazılmıştır beri FWIW, ben sınıf tabanlı görünümleri hakkında fikrimi değiştirdim. Projelerin bir çift yoğun kullanmıştır ettikten sonra, işlevselliği kadar çok farklı yerlere yayılmış çünkü onlar, okuma ve daha sonra korumak için yazmaya satisfyingly KURU, ama çok zor koda sebep olma eğilimi hissediyorum ve alt sınıfları böylece bağımlıdır süper sınıf ve Mixins her uygulama detay üzerinde. Şimdi hissediyorum TemplateResponse ve görünümü dekoratörler görünümü kodunu parçalamak için daha iyi bir cevaptır.

Cevap 29/08/2008 saat 05:29
kaynak kullanıcı

oy
13

Sınıf temelli görünümlerini kullanmak için gerekli, ama her zaman kullanmadan önce görünümü sınıf örneğini gerek kalmadan benim URLconf içinde sınıfın tam adını kullanabilmek için istedi. Ne beni şaşırtıcı derecede basit metaclass oldu yardımcı:

class CallableViewClass(type):
    def __call__(cls, *args, **kwargs):
        if args and isinstance(args[0], HttpRequest):
            instance = super(CallableViewClass, cls).__call__()
            return instance.__call__(*args, **kwargs)
        else:
            instance = super(CallableViewClass, cls).__call__(*args, **kwargs)
            return instance


class View(object):
    __metaclass__ = CallableViewClass

    def __call__(self, request, *args, **kwargs):
        if hasattr(self, request.method):
            handler = getattr(self, request.method)
            if hasattr(handler, '__call__'):
                return handler(request, *args, **kwargs)
        return HttpResponseBadRequest('Method Not Allowed', status=405)

Şimdi hem görünüm sınıfları örneğini ve görünümü fonksiyonları olarak örneklerini kullanmak VEYA ben sadece benim için görünüm sınıfını dersime benim URLconf işaret ve metaclass örneğini (ve çağrı) can. Bu ilk argüman kontrol ederek çalışır __call__- bu bir eğer HttpRequestbir bir görünüm sınıf örneğini oluşturmak için attept anlamsız olacaktır, çünkü, gerçek bir HTTP isteği olmalıdır HttpRequestörneği.

class MyView(View):
    def __init__(self, arg=None):
        self.arg = arg
    def GET(request):
        return HttpResponse(self.arg or 'no args provided')

@login_required
class MyOtherView(View):
    def POST(request):
        pass

# And all the following work as expected.
urlpatterns = patterns(''
    url(r'^myview1$', 'myapp.views.MyView', name='myview1'),
    url(r'^myview2$', myapp.views.MyView, name='myview2'),
    url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'),
    url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),
)

(Ben bunun için bir pasajı yayınlanmıştır http://djangosnippets.org/snippets/2041/ )

Cevap 27/05/2010 saat 14:02
kaynak kullanıcı

oy
9

Sadece modellerinden veri gösterdiğinizi, neden kullanmaz Django Jenerik Görüntüleme ? Onlar görüşlerine haritalama URL Paramaters, kenar davalarına, verilerin alınmasına render çıkış, vb hakkında kendi görünümünüzü ve malzeme yazmak zorunda kalmadan size modelden kolay gösteri verilerini bildirmek için tasarlanmış konum

Cevap 07/08/2008 saat 11:44
kaynak kullanıcı

oy
3

Her zaman, bir sınıf oluşturmak geçersiz kılabilirsiniz __call__fonksiyonu ve daha sonra sınıfının bir örneğine bir URL dosyasını etmektedir. Sen bir göz alabilir FormWizard bu nasıl yapıldığını görmek için sınıfa.

Cevap 26/08/2008 saat 12:38
kaynak kullanıcı

oy
2

Eğer jenerik görünümleri kullanarak, bir şey biraz karmaşık yapmak istemiyorsan gitmek için bir yoldur. Sadece iş yapacak Model verilerini jenerik görüntülemeler gösterilir eğer onlar kadar kendi adından da anlaşılacağı daha güçlü ve.

Cevap 11/08/2008 saat 23:59
kaynak kullanıcı

oy
2

Eğer kombine edilmemelidir şeyleri birleştirmek için çalışıyoruz gibi geliyor. Eğer bu bir kullanıcı var veya Grup o zaman iki farklı bakış fonksiyonlarını kullanmalısınız bakmak için çalışıyoruz itiraz ediyorsanız bağlı olarak görünümde farklı işlem yapmak gerekiyorsa.

Öte yandan belki bir dekoratör ya da sadece yardımcı işlevlerini kullanabilirsiniz ... Eğer object_detail tip görüşlerin dışında ayıklamak isterdim ortak deyimler olabilir?

-Dan

Cevap 03/08/2008 saat 18:40
kaynak kullanıcı

oy
1

Sen Django Jenerik Görüntüleme kullanabilirsiniz. Kolayca istenen işlevselliği kapsamlı Django jenerik Görüntüleme elde edebilirsiniz

Cevap 08/10/2014 saat 06:53
kaynak kullanıcı

oy
1

Jenerik görünümleri genellikle gitmek için bir yol olacak, ama sonuçta istediğiniz ancak URL'ler işlemek için özgürsünüz. RESTful API'ler için bazı uygulamalar gibi FormWizard, sınıf tabanlı bir şekilde şeyler yapar.

Temelde bir URL ile size tamamen size kalmıştır sağlamak çağrılabilir neyi değişkenler ve bir çağrılabilir sağlamak için yerinde, bir demet verilir - standart yolu bir işlev temin etmektir - ama sonuçta Django yaptıklarınızdan hiçbir kısıtlama koyar.

Bunun iyi olurdu nasıl yapılacağına ilişkin birkaç örnek daha, FormWizard muhtemelen olsa başlamak için bir yer olduğunu katılıyorum.

Cevap 23/09/2008 saat 20:05
kaynak kullanıcı

oy
1

Sayfalar arasında ortak işlevselliği paylaşmak istiyorsanız ben özel etiketleri bakmak öneririz. Onlar oldukça konum oluşturmak kolaydır ve çok güçlüdür.

Ayrıca, şablonlar diğer şablonlardan uzatabilirsiniz . Bu sayfanın düzenini kurmak için bir üs şablonu olması ve boşlukları doldurmak diğer şablonları arasındaki bu paylaşmanızı sağlar. Herhangi derinliğe iç içe şablonları; Bir yerde ilgili sayfaların ayrı grup üzerinde düzenini belirtmek için izin.

Cevap 26/08/2008 saat 12:30
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more