Vă mulțumim pentru susținere

Vederi de clasă în Django

Django view points to a function, which can be a problem if you want to change only a bit of functionality. Yes, I could have million keyword arguments and even more if statements in the function, but I was thinking more of an object oriented approach.

De exemplu, am o pagină care afișează un utilizator. Această pagină este foarte asemănătoare cu cea a paginii care afișează un grup, dar încă nu este similară cu utilizarea unui alt model de date. Grupul are, de asemenea, membri etc ...

O modalitate ar fi să se pună punct de vedere la metodele de clasă și apoi să se extindă acea clasă. A încercat cineva această abordare sau are altă idee?

0
adăugat editat
Sigur, mulțumesc lui Alex. Am uitat pe unii. :-)
adăugat autor engtech
@ George2: Puteți să vă revedeți întrebările mai vechi și să căutați pentru cele care ar trebui marcate ca răspuns? Dacă nu ați primit răspunsurile dorite, modificați-vă și clarificați-vă întrebările. Mulțumiri!!
adăugat autor Alex Angas

10 răspunsuri

Am jucat cu acestea puțin și am găsit niște documente utile în trecut.

Uitați-vă la forumul robot pe el.

Practic rulați lucrarea "home" pe robot, aveți nevoie de poziția absolută din fiecare axă și acest lucru se găsește pe un autocolant din interiorul controlerului. În poziția de start ar trebui să aveți toate săgețile de referință aliniate.

Dacă poziția inițială a fost pierdută, memoria encoderului este pierdută. Numără 4000 de puncte pentru fiecare revoluție - dacă memoria encoder-ului este pierdută, ea nu știe câte au trecut.

Luați diferența între poziția inițială a codificatorului nou și cea veche și împărțiți-o cu 4000 - acest lucru vă va oferi cât de mulți au ieșit.

exemplul dat a fost:

Numărul inițial de encodere de origine: -119771 Număr nou de encodere de la domiciliu (după întinderea marcajelor de referință și stabilirea datelor pentru acea axă): -95834 Diferența: -23937 Împărțită de 4000: 5.98425 Prin urmare, numărul de revoluții a fost 6 apoi să fie -119771 + (6) x (4000) = -95771

4
adăugat

Consultați Partea Web a interogării de conținut.

3
adăugat
da, îmi pare rău a fost în grabă pe cale de o întâlnire! thx kusek
adăugat autor Anonymous User
@George Este posibil să aveți nevoie să deschideți o nouă întrebare pentru acest lucru. Dar vă voi da răspunsul aici pentru Partea Web de interogare de conținut. blogs.msdn.com/ecm/archive/2006/10/25/…
adăugat autor Isaac Moses
Mersi Anders! Îmi puteți arăta mai multe informații despre cum să folosiți "Partea Web de interogare de conținut" pentru a crea o listă care ar putea fi afișată atât pe site-ul părinte, cât și pe site-ul copil (pentru a afișa același conținut)?
adăugat autor engtech

Vizualizările generice vor fi de obicei calea de urmat, dar în cele din urmă sunteți liberi să vă ocupați de URL-uri, oricum doriți. FormWizard face lucrurile într-un mod bazat pe clasă, la fel ca și unele aplicații pentru API-urile RESTful.

În principiu, cu un URL vă sunt oferite o mulțime de variabile și loc pentru a oferi un apel callabil, ceea ce vă poate oferi callabil este complet până la tine - modul standard este de a oferi o funcție - dar în cele din urmă Django nu pune nici o restricție asupra a ceea ce faci.

Sunt de acord că mai multe exemple de cum să faceți acest lucru ar fi bine, FormWizard este, probabil, locul de început, totuși.

0
adăugat

Am creat și mi-am folosit propriile clase de vizualizare generică, definind __ apel __ , astfel încât o instanță a clasei să fie apelabilă. Chiar imi place; în timp ce viziunile generice ale lui Django permit anumite particularizări prin argumentele cuvintelor cheie, viziunile OO generice (dacă comportamentul lor este împărțit într-un număr de metode separate) pot avea o personalizare mai fină prin subclasare, ceea ce mă permite să mă repete mult mai puțin. (M-am săturat să rescriu aceeași logică de creare / actualizare ori de câte ori am nevoie pentru a modifica ceva ce opinii generice Django nu permit destul de mult).

Am postat un cod la adresa djangosnippets.org .

Singurul dezavantaj real pe care îl văd este proliferarea apelurilor de metode interne, care pot afecta performanța într-o oarecare măsură. Nu cred că acest lucru este un motiv de îngrijorare; este rar faptul că executarea codului Python va reprezenta blocarea performanței într-o aplicație web.

UPDATE: Django's own generic views are now class-based.

UPDATE: FWIW, I've changed my opinion on class-based views since this answer was written. After having used them extensively on a couple of projects, I feel they tend to lead to code that is satisfyingly DRY to write, but very hard to read and maintain later, because functionality is spread across so many different places, and subclasses are so dependent on every implementation detail of the superclasses and mixins. I now feel that TemplateResponse and view decorators is a better answer for decomposing view code.

0
adăugat
Executarea Python nu este GFI, dar ar putea afecta scalabilitatea site-ului și, în general, performanța. Sunt atât de bucuros că memcache există!
adăugat autor StefanNch

Dacă doriți să partajați funcționalitatea comună între pagini, vă sugerăm să vă uitați la etichetele personalizate. Ei sunt destul de ușor de creat și sunt foarte puternic.

De asemenea, șabloanele se pot extinde și din alte șabloane . Acest lucru vă permite să aveți un șablon de bază pentru a seta aspectul paginii și pentru a distribui aceasta între alte șabloane care completează spațiile libere. Puteți crea șabloane la orice adâncime; permițându-vă să specificați aspectul pe grupuri separate de pagini înrudite într-un singur loc.

0
adăugat
Nu cred că pune prea multă logică în șablon este o idee bună.
adăugat autor Attila O.

Cu excepția cazului în care doriți să faceți ceva puțin complex, folosirea vederilor generice reprezintă calea de urmat. Ele sunt mult mai puternice decât numele lor implică, iar dacă afișați datele modelului, vizualizările generice vor face treaba.

0
adăugat

Dacă afișați pur și simplu date de la modele, de ce să nu utilizați Django Generic Views ? Acestea sunt concepute pentru a vă permite să afișați cu ușurință date dintr-un model fără a fi nevoie să scrieți propriile vizualizări și lucruri despre cartografierea parametrilor URL pentru vizualizări, preluarea datelor, manipularea cazurilor de margine, randarea redării etc.

0
adăugat

Puteți să creați întotdeauna o clasă, să înlocuiți funcția __ și apoi să îndreptați fișierul URL către o instanță a clasei. Puteți să aruncați o privire la FormWizard pentru a vedea cum se face acest lucru.

0
adăugat
Procesorul de marcare a mâncat __-urile tale. Utilizați \ _ pentru a ascunde marcajul. Metoda __call__ de clasă este ceea ce se numește. Problema este să fii sigur că urls.py are la dispoziție o instanță a clasei. Îți face urls.py oarecum mai complicat.
adăugat autor S.Lott

Aveam nevoie de vizualizări bazate pe clasă, dar am vrut să pot folosi numele complet al clasei în URLconf-ul meu, fără a trebui întotdeauna să instanțiate clasa de vizualizare înainte de ao folosi. Ceea ce ma ajutat a fost o metaclașă surprinzător de simplă:

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)

Eu pot acum atât instantia clase de vizualizare și de a folosi instanțele ca funcții vedere, sau pot indica pur și simplu URLconf mea la clasa mea și au instanțiați metaclass (și apel) clasa de vizualizare pentru mine. Aceasta funcționează prin verificarea primului argument la __ apel __ ? dacă este un HttpRequest , aceasta trebuie să fie o cerere reală HTTP, deoarece ar fi un nonsens să attept pentru a instantia o clasă vedere cu HttpRequest instanță.

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

(Am postat un fragment pentru acest lucru la http://djangosnippets.org/snippets/2041/ )

0
adăugat
destul de literalmente minunat
adăugat autor Anentropic

Puteți utiliza vizualizările Generale Django. Puteți obține cu ușurință funcționalitatea dorită a vizualizărilor generice Django generice

0
adăugat