vista di classe in Django

voti
48

Django punti di vista a una funzione, che può essere un problema se si desidera cambiare solo un po 'di funzionalità. Sì, avrei potuto milione di argomenti chiave e ancora di più se dichiarazioni in funzione, ma pensavo più di un approccio orientato agli oggetti.

Per esempio, ho una pagina che visualizza un utente. Questa pagina è molto simile alla pagina che visualizza un gruppo, ma non è ancora così simile ad usare solo un altro modello di dati. Gruppo dispone anche membri ecc ...

Un modo potrebbe essere quello di puntare vista metodi di classe e quindi estendere tale classe. Qualcuno ha provato questo approccio o ha qualche altra idea?

È pubblicato 03/08/2008 alle 14:55
fonte dall'utente
In altre lingue...                            


9 risposte

voti
2

Suona per me come si sta cercando di combinare le cose che non dovrebbero essere combinati. Se avete bisogno di fare l'elaborazione diverso nella vista a seconda se si tratta di un utente o gruppo oggetto che si sta cercando di guardare allora dovreste usare due diverse funzioni di visualizzazione.

D'altra parte non ci può essere modi di dire comuni che ci si desidera estrarre dal vostro punto di vista di tipo object_detail ... forse si potrebbe usare un decoratore o solo funzioni di supporto?

-Dan

Risposto il 03/08/2008 a 16:40
fonte dall'utente

voti
9

Se siete semplicemente la visualizzazione dei dati dai modelli, perché non utilizzare le Visualizzazioni Django generici ? Sono progettati per farvi facile visualizzare i dati dal modello senza dover scrivere il proprio punto di vista e cose su di mappatura URL paramaters a vista, il recupero dei dati, la gestione casi limite, in uscita il rendering, ecc

Risposto il 07/08/2008 a 09:44
fonte dall'utente

voti
2

A meno che non si vuole fare qualcosa di un po 'complessa, utilizzando il punto di vista generici sono la strada da percorrere. Essi sono molto più potente di loro nome, e se sono solo la visualizzazione dei dati del modello viste generiche farà il lavoro.

Risposto il 11/08/2008 a 21:59
fonte dall'utente

voti
1

Se si desidera condividere funzionalità comuni tra le pagine Vi suggerisco di guardare al tag personalizzati. Sono abbastanza facili da creare , e sono molto potenti.

Inoltre, i modelli possono estendersi da altri modelli . Questo permette di avere un modello di base per impostare il layout della pagina e di condividere questo con altri modelli che riempiono gli spazi vuoti. È possibile modelli di nido per ogni profondità; che consente di specificare il layout su gruppi distinti di pagine correlate in un unico luogo.

Risposto il 26/08/2008 a 10:30
fonte dall'utente

voti
3

È sempre possibile creare una classe, eseguire l'override della __call__funzione e poi puntare il file URL a un'istanza della classe. Si può dare un'occhiata al FormWizard classe per vedere come questo è fatto.

Risposto il 26/08/2008 a 10:38
fonte dall'utente

voti
41

Ho creato e usato il mio classi di visualizzazione generici, definendo __call__così un'istanza della classe è callable. Mi piace veramente; mentre viste generiche di Django permettono qualche personalizzazione attraverso argomenti a parola chiave, OO viste generiche (se il loro comportamento è divisa in un certo numero di metodi separati) possono avere molto più a grana fine personalizzazione tramite sottoclassi, che mi permette di ripetermi molto meno. (Mi stanco di riscrivere lo stesso creare / aggiornare in qualsiasi momento vista la logica che ho bisogno di modificare qualcosa di vista generico di Django non del tutto consentono).

Ho postato un codice a djangosnippets.org .

L'unico vero problema che vedo è la proliferazione di chiamate di metodo interne, che potrebbero incidere sul rendimento alquanto. Non credo che questo è molto più di una preoccupazione; è raro che l'esecuzione di codice Python sarebbe il tuo collo di bottiglia in una web app.

UPDATE : proprio di Django viste generiche sono ora basato su classi.

UPDATE : FWIW, ho cambiato la mia opinione su di vista di classe a base dal momento che questa risposta è stata scritta. Dopo averli ampiamente utilizzato su un paio di progetti, mi sento che tendono a portare a codice che è soddisfacentemente DRY di scrivere, ma molto difficile da leggere e mantenere in seguito, perché la funzionalità è distribuito su tanti posti diversi, e sottoclassi sono così dipendenti su ogni dettaglio di implementazione delle superclassi e mixins. Ora mi sento che TemplateResponse e visualizzare i decoratori è una risposta migliore per la decomposizione codice della vista.

Risposto il 29/08/2008 a 03:29
fonte dall'utente

voti
1

vista generico di solito è la strada da percorrere, ma alla fine si è liberi di gestire gli URL nel modo desiderato. FormWizard fa le cose in un modo di classe, così come alcune applicazioni per le API RESTful.

In sostanza con un URL che si è dato un sacco di variabili e luogo per fornire un callable, quello callable che fornisci è completamente a voi - il modo standard è quello di fornire una funzione - ma alla fine Django non pone restrizioni su quello che fate.

Sono d'accordo che un paio di esempi di come fare questo sarebbe bene, FormWizard è probabilmente il punto di partenza però.

Risposto il 23/09/2008 a 18:05
fonte dall'utente

voti
13

Avevo bisogno di utilizzare le viste a base di classe, ma volevo essere in grado di utilizzare il nome completo della classe nel mio URLconf, senza dover sempre un'istanza della classe di visualizzazione prima di utilizzarlo. Quello che mi ha aiutato è stato un sorprendentemente semplice metaclasse:

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)

Ora posso sia istanziare classi di visualizzazione e utilizzare le istanze come funzioni di visualizzazione, o posso semplicemente puntare il mio URLconf alla mia classe e hanno l'instantiate metaclasse (e chiamare) la classe di visualizzazione per me. Questo funziona controllando il primo argomento di __call__- se è una HttpRequest, deve essere una richiesta HTTP reale perché sarebbe assurdo attept creare un'istanza di un classe di visualizzazione con un HttpRequestesempio.

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

(Ho pubblicato un frammento per questo a http://djangosnippets.org/snippets/2041/ )

Risposto il 27/05/2010 a 12:02
fonte dall'utente

voti
1

È possibile utilizzare le Visualizzazioni Django generici. Si può facilmente raggiungere funzionalità desiderata approfondite Django generici Visualizzazioni

Risposto il 08/10/2014 a 04:53
fonte dall'utente

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