θέα Class σε Django

ψήφοι
48

Django σημεία σκοπό τη λειτουργία, η οποία μπορεί να είναι ένα πρόβλημα, αν θέλετε να αλλάξετε μόνο ένα κομμάτι της λειτουργικότητας. Ναι, θα μπορούσα να έχω εκατομμύρια επιχειρήματα λέξη-κλειδί και ακόμα περισσότερο αν δηλώσεις στη λειτουργία, αλλά σκεφτόμουν περισσότερο από μια αντικειμενοστραφή προσέγγιση.

Για παράδειγμα, έχω μια σελίδα που εμφανίζει ένα χρήστη. Αυτή η σελίδα είναι πολύ παρόμοια με τη σελίδα που εμφανίζει μια ομάδα, αλλά ακόμα δεν είναι τόσο όμοια να χρησιμοποιήσετε μόνο ένα άλλο μοντέλο δεδομένων. Όμιλος έχει επίσης μέλη κλπ ...

Ένας τρόπος θα ήταν να επισημάνει τις απόψεις με τις μεθόδους της κατηγορίας και στη συνέχεια να παρατείνει την εν λόγω κατηγορία. Έχει κανείς δοκιμάσει την προσέγγιση αυτή ή έχει κάποια άλλη ιδέα;

Δημοσιεύθηκε 03/08/2008 στις 16:55
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
41

Έχω δημιουργήσει και να χρησιμοποιηθεί το δικό μου γενικές κατηγορίες άποψη, ορίζοντας __call__έτσι ένα στιγμιότυπο της κλάσης είναι δυνατό να εξοφληθεί πρόωρα. Μου αρέσει πολύ; ενώ η γενική απόψεις Django επιτρέπουν κάποια προσαρμογή με επιχειρήματα λέξη-κλειδί, OO γενικές απόψεις (αν η συμπεριφορά τους είναι χωρισμένο σε μια σειρά από διαφορετικές μεθόδους) μπορεί να έχουν πολύ πιο λεπτομερή παραμετροποίηση μέσω υποκλάσεις, η οποία σας επιτρέπει να επαναλάβω τον εαυτό μου πολύ λιγότερο. (Έχω κουραστεί από την επανασύνταξη του ίδιου δημιουργήσετε / ενημέρωση άποψη λογικής ανά πάσα στιγμή θα πρέπει να τσίμπημα κάτι γενικό απόψεις Django του δεν είναι αρκετά δυνατή).

Έχω δημοσιεύτηκε κάποια κώδικα σε djangosnippets.org .

Το μόνο πραγματικό μειονέκτημα που βλέπω είναι ο πολλαπλασιασμός των εσωτερικών κλήσεων μεθόδου, η οποία μπορεί να επηρεάσει την απόδοση κάπως. Δεν νομίζω ότι αυτό είναι ένα μεγάλο μέρος μιας ανησυχίας? είναι σπάνιο ότι η εκτέλεση κώδικα Python θα ήταν εμπόδιο απόδοσή σας σε ένα web app.

UPDATE : τη δική Django είναι γενικές απόψεις είναι πλέον ταξικά.

UPDATE : FWIW, έχω αλλάξει την άποψή μου για τις απόψεις ταξικό αφού η απάντηση αυτή γράφτηκε. Αφού αυτά χρησιμοποιούνται ευρέως σε ένα ζευγάρι των έργων, νιώθω τείνουν να οδηγήσουν σε κώδικα που είναι ικανοποιητικά DRY να γράψω, αλλά πολύ δύσκολο να διαβαστεί και να διατηρήσει αργότερα, επειδή η λειτουργικότητα έχει εξαπλωθεί σε όλη τόσα πολλά διαφορετικά μέρη, και υποκατηγορίες είναι τόσο εξαρτημένη σε κάθε λεπτομέρεια εφαρμογής των υπερκλάσεών και τα μείγματα. Τώρα αισθάνομαι ότι TemplateResponse και θέα διακοσμητές είναι η καλύτερη απάντηση για την αποσύνθεση κωδικό άποψη.

Απαντήθηκε 29/08/2008 στις 05:29
πηγή χρήστη

ψήφοι
13

Έπρεπε να χρησιμοποιήσετε τις απόψεις με βάση την κατηγορία, αλλά ήθελα να είναι σε θέση να χρησιμοποιήσει το πλήρες όνομα της κλάσης στην URLconf μου χωρίς πάντα να πρέπει να υπόσταση της κλάσης άποψη πριν το χρησιμοποιήσετε. Αυτό που με βοήθησε ήταν μια εκπληκτικά απλή μετακλάση:

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)

Μπορώ τώρα τόσο υπόσταση τάξεις άποψη και να χρησιμοποιήσετε τις περιπτώσεις και λειτουργίες άποψη, ή απλά να επισημάνω URLconf μου στην τάξη μου και να έχουν την υπόσταση μετακλάση (και κλήση) την τάξη άποψη για μένα. Αυτό λειτουργεί ελέγχοντας το πρώτο επιχείρημα __call__- αν είναι ένα HttpRequest, θα πρέπει να είναι ένα πραγματικό αίτημα HTTP, διότι θα ήταν ανοησία να attept να υπόσταση σε μια τάξη θέα με ένα HttpRequestπαράδειγμα.

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

(Ι δημοσιεύτηκε ένα απόσπασμα γι 'αυτό σε http://djangosnippets.org/snippets/2041/ )

Απαντήθηκε 27/05/2010 στις 14:02
πηγή χρήστη

ψήφοι
9

Αν είστε απλά εμφανίζει δεδομένα από μοντέλα, γιατί να μην χρησιμοποιούν τις Django Generic Εμφανίσεις ; Είναι σχεδιασμένο για να σας αφήσει εύκολα τα δεδομένα δείχνουν από ένα μοντέλο χωρίς να χρειάζεται να γράψετε τη δική σας άποψη και πράγματα για paramaters χαρτογράφηση διεύθυνση URL για τις απόψεις, την ανάκτηση των δεδομένων, την εξέταση των υποθέσεων άκρη, καθιστώντας εξόδου, κλπ

Απαντήθηκε 07/08/2008 στις 11:44
πηγή χρήστη

ψήφοι
3

Μπορείτε πάντα να δημιουργήσετε μια τάξη, την παράκαμψη της __call__λειτουργίας και στη συνέχεια επιλέξτε το αρχείο URL σε ένα στιγμιότυπο της κλάσης. Μπορείτε να ρίξετε μία ματιά στο FormWizard κατηγορία για να δείτε πώς γίνεται αυτό.

Απαντήθηκε 26/08/2008 στις 12:38
πηγή χρήστη

ψήφοι
2

Εκτός αν θέλετε να κάνετε κάτι λίγο περίπλοκο, χρησιμοποιώντας τις γενικές απόψεις είναι ο τρόπος να πάει. Είναι πολύ πιο ισχυρή από ό, τι υποδηλώνει το όνομά τους, και αν είναι μόνο εμφάνιση μοντέλο δεδομένων γενικές απόψεις θα κάνει τη δουλειά.

Απαντήθηκε 11/08/2008 στις 23:59
πηγή χρήστη

ψήφοι
2

Ήχοι για μένα σαν να προσπαθείτε να συνδυάσετε τα πράγματα που δεν πρέπει να συνδυαστούν. Εάν πρέπει να κάνετε διαφορετικές επεξεργασίας κατά την άποψή σας, ανάλογα με το αν πρόκειται για ένα χρήστη ή ομάδας αντικείμενο που προσπαθείτε να δείτε στη συνέχεια, θα πρέπει να χρησιμοποιήσετε δύο διαφορετικές λειτουργίες προβολής.

Από την άλλη πλευρά, δεν μπορεί να υπάρξει κοινή ιδιώματα που θα θέλατε να εξαγάγετε από object_detail απόψεις τύπου σας ... ίσως θα μπορούσατε να χρησιμοποιήσετε ένα διακοσμητή ή απλά βοηθητικές λειτουργίες;

-Dan

Απαντήθηκε 03/08/2008 στις 18:40
πηγή χρήστη

ψήφοι
1

Μπορείτε να χρησιμοποιήσετε τις Django Generic Προβολές. Μπορείτε εύκολα να επιτευχθούν τα επιθυμητά λειτουργικότητα σε βάθος Django γενική Εμφανίσεις

Απαντήθηκε 08/10/2014 στις 06:53
πηγή χρήστη

ψήφοι
1

Γενικές απόψεις συνήθως θα είναι ο τρόπος να πάει, αλλά τελικά είστε ελεύθεροι να χειριστεί διευθύνσεις URL όπως θέλετε. FormWizard κάνει τα πράγματα σε μια τάξη με βάση τον τρόπο, όπως κάνουν κάποιες εφαρμογές για ξεκούραστη APIs.

Βασικά με μια διεύθυνση URL σας δίνεται μια δέσμη των μεταβλητών και τον τόπο για να παρέχουν ένα δικαίωμα ανάκλησης, τι απαιτητών που παρέχετε είναι εντελώς από εσάς - ο συνήθης τρόπος είναι να παρέχει μια λειτουργία - αλλά τελικά Django βάζει περιορισμούς σε αυτό που κάνετε.

Συμφωνώ ότι μερικά ακόμη παραδείγματα για το πώς να το κάνουμε αυτό θα ήταν καλό, FormWizard είναι ίσως το μέρος για να ξεκινήσετε όμως.

Απαντήθηκε 23/09/2008 στις 20:05
πηγή χρήστη

ψήφοι
1

Αν θέλετε να μοιραστείτε κοινή λειτουργικότητα μεταξύ των σελίδων σας προτείνω να εξετάσουμε προσαρμοσμένες ετικέτες. Είναι πολύ εύκολο να δημιουργηθούν , και είναι πολύ ισχυρό.

Επίσης, τα πρότυπα μπορούν να εκτείνονται από άλλα πρότυπα . Αυτό σας επιτρέπει να έχετε ένα πρότυπο βάση για να δημιουργήσει τη διάταξη της σελίδας και να μοιραστούν αυτό μεταξύ άλλων τα πρότυπα που γεμίζουν τα κενά. Μπορείτε να φωλιάζουν πρότυπα σε οποιοδήποτε βάθος? που σας επιτρέπει να καθορίσετε τη διάταξη για ξεχωριστές ομάδες των σχετικές σελίδες σε ένα μέρος.

Απαντήθηκε 26/08/2008 στις 12:30
πηγή χρήστη

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