Class nézetek Django

szavazat
48

Django kilátás arra utal, hogy a funkció, amely lehet a probléma, ha meg akarja változtatni csak egy kicsit a funkcionalitás. Igen, tudtam volna millió címszó érvek és még inkább, ha nyilatkozatok a funkciót, de arra gondoltam, inkább egy objektum orientált megközelítés.

Például, van egy oldal, amely megjeleníti a felhasználó. Ez az oldal nagyon hasonlít a megjelenítő oldal egy csoport, de ez még mindig nem annyira hasonló, hogy csak használja egy másik adat modell szerint. Csoport is tagja, stb ...

Ennek egyik módja az lenne, hogy pont nézetek osztály módszerek majd kiterjeszteni az osztályban. Valaki próbálta ezt a megközelítést, vagy bármilyen más ötlet?

A kérdést 03/08/2008 16:55
a forrás felhasználó
Más nyelveken...                            


9 válasz

szavazat
2

Úgy tûnik akarsz kombinálni a dolgokat, hogy nem lehet összevonni. Ha meg kell tennie a különböző feldolgozási Ön szerint attól függően, hogy egy felhasználó vagy csoport kifogást próbált nézni, akkor meg kell használni a két különböző nézetet funkciókat.

Másrészt nem lehet közös kifejezéseket azt szeretné bontani ki a object_detail nézetei ... talán jól jönne egy lakberendező, vagy csak segítő funkciókat?

-Dan

Válaszolt 03/08/2008 18:40
a forrás felhasználó

szavazat
9

Ha egyszerűen csak adatokat bemutató modellekből, miért nem használja a Django Generic Views ? Ők tervezték, hogy segítségével könnyen adatokat mutat egy modell, anélkül, hogy írja meg a saját véleménye, és a cucc feltérképezése URL PARAMATERS a véleményüket, az adatok lekérése, kezelése szélső esetek, renderelés kimenet, stb

Válaszolt 07/08/2008 11:44
a forrás felhasználó

szavazat
2

Hacsak nem akar tenni valamit egy kicsit bonyolult, a generikus nézetek az út. Ők sokkal erősebb, mint a neve is mutatja, és ha csak a megjelenítő modell adatai generikus nézeteit fogja ezt a munkát.

Válaszolt 11/08/2008 23:59
a forrás felhasználó

szavazat
1

Ha azt szeretnénk, hogy megosszák a közös alkalmassága oldalak között azt javasoljuk, hogy nézd meg az egyéni címkéket. Ők nagyon könnyű létrehozni , és nagyon erős.

Továbbá, sablonok kiterjeszti más sablonokat . Ez lehetővé teszi, hogy egy alap sablont létrehozni az elrendezés az oldal és megosztani ezt közötti egyéb sablonok, amely kitölti az üres helyeket. Ágyazhatók sablonok bármilyen mélységben; amely lehetővé teszi, hogy meghatározza az elrendezés külön csoportokban kapcsolódó oldalak egy helyen.

Válaszolt 26/08/2008 12:30
a forrás felhasználó

szavazat
3

Bármikor létrehozhat egy osztály, felülírja a __call__funkciót, majd pont az URL-fájlt egy példányát az osztálynak. Akkor vessen egy pillantást a FormWizard osztály lássa hogy ez hogyan történik.

Válaszolt 26/08/2008 12:38
a forrás felhasználó

szavazat
41

Már létrehozott és használt saját általános nézet osztályok meghatározása __call__tehát egy példánya a felmondhatóság. Nagyon tetszik; míg Django általános nézetek lehetővé teszik néhány testreszabási keresztül kulcsszó érvek, OO általános nézetek (ha viselkedésük van osztva több különálló módszerek) lehet sokkal finomabb testreszabási keresztül öröklõdés, amely lehetővé teszi számomra ismételni magam sokkal kevesebb. (Elfáradok átírta az azonos létrehozni / frissítés nézet logika, amikor csak kell csípés valamit Django általános nézetek nem elég lehetővé teszi).

Már írt néhány kódot djangosnippets.org .

Az egyetlen igazi hátránya látom elterjedése belső eljárásoknak, amelyek hatással lehetnek a teljesítmény valamelyest. Nem hiszem, hogy ez a nagy aggodalomra ad okot; ez ritka, hogy a Python kódfuttatást lenne a teljesítmény szűk egy web app.

UPDATE : Django saját generikus nézeteit most osztály alapú.

UPDATE : FWIW, már megváltozott a véleményem osztály alapú nézetek, mivel ezt a választ írták. Miután használta őket széles körben néhány projektet, úgy érzem, hajlamosak vezet kódot, ami megnyugtatóan DRY írni, de nagyon nehéz olvasni, és fenntartani később, mert alkalmassága oszlik sok különböző helyen, és alosztályok annyira függ minden végrehajtás részleteit a superclasses és mixinek. Most érzem, hogy TemplateResponse és tekintse festő egy jobb válasz lebontó nézet kódot.

Válaszolt 29/08/2008 05:29
a forrás felhasználó

szavazat
1

Általános nézetek általában az út, de végül nyugodtan kezelni URL, ahogy akarod. FormWizard nem a dolgok egy osztály-alapú módon, mint ahogy néhány apps RESTful API-kat.

Alapvetően egy URL-t kapnak egy csomó változók és helyen, hogy egy visszahívható, mit lehívható Ön által teljesen rajtad múlik - a szokásos módon, hogy egy funkció - de végül Django helyezi nincs korlátozás, hogy mit csinál.

Egyetértek, hogy még néhány példát arra, hogyan kell ezt csinálni, jó lenne, FormWizard valószínűleg a kiindulópont mégis.

Válaszolt 23/09/2008 20:05
a forrás felhasználó

szavazat
13

Kellett használni osztály alapú nézetek, de azt akartam, hogy tudja használni a teljes nevét az osztály az én URLconf nélkül mindig kelljen példányosításához véli, osztály használata előtt. Mi segített egy meglepően egyszerű metaclass:

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)

Most már mindkét példányosíthatnak nézet osztályok, és a példányok a felvétel funkciók, vagy én egyszerűen pont az én URLconf az osztályba, és a metaclass példányosításához (és hívja) a nézet osztályban nekem. Ez úgy működik, ellenőrzi az első érv, hogy __call__- ha ez egy HttpRequest, meg kell egy tényleges HTTP kérelmet, mert nem lenne ostobaság attept példányosíthat céljából osztály egy HttpRequestpéldányt.

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

(I írt egy darabot erre a http://djangosnippets.org/snippets/2041/ )

Válaszolt 27/05/2010 14:02
a forrás felhasználó

szavazat
1

Használhatja a Django Generic Views. Könnyedén elérheti a kívánt funkciókat alapos Django általános nézete

Válaszolt 08/10/2014 06:53
a forrás felhasználó

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