سؤال

جانغو عرض يشير إلى وظيفة ، والتي يمكن أن يكون مشكلة إذا كنت ترغب في تغيير سوى القليل من الوظائف.نعم, أنا يمكن أن يكون مليون الكلمة الحجج و حتى أكثر من ذلك إذا كانت البيانات في وظيفة ، ولكن كنت أفكر أكثر من كائن النهج الموجه.

على سبيل المثال لدي صفحة يعرض المستخدم.هذه الصفحة هي مشابهة جدا إلى الصفحة التي يعرض مجموعة, لكنه لا يزال لا تشبه فقط استخدام آخر نموذج البيانات.المجموعة أيضا أعضاء الخ...

طريقة واحدة سيكون نقطة وجهات النظر إلى أساليب الفئة ثم تمتد تلك الفئة.وقد حاول أي شخص هذا النهج أو لديه أي فكرة ؟

هل كانت مفيدة؟

المحلول

لقد خلق و تستخدم بلدي عامة عرض دروس تحديد __call__ حتى مثيل الدرجة المستحقة.أنا حقا مثل ذلك ؛ في حين جانغو عام الآراء تسمح بعض التخصيص من خلال الكلمة الحجج ، OO العامة وجهات النظر (إذا كان سلوكهم هو تنقسم إلى عدد من طرق منفصلة) يمكن أن يكون أكثر من ذلك بكثير غرامة الحبيبات التخصيص عبر subclassing الذي يتيح لي أن أكرر نفسي أقل كثيرا.(أنا تعبت من كتابة نفس إنشاء/تحديث عرض منطق في أي وقت أنا بحاجة إلى قرص شيء جانغو العامة وجهات النظر لا يسمح).

لقد نشرت بعض التعليمات البرمجية في djangosnippets.org.

الجانب السلبي الوحيد الذي أراه هو انتشار الداخلية طريقة المكالمات التي قد تؤثر على الأداء إلى حد ما.أنا لا أعتقد أن هذا هو الكثير من القلق ؛ ومن النادر أن الثعبان رمز التنفيذ سيكون اختناق الأداء الخاص بك في التطبيق على شبكة الإنترنت.

التحديث:جانغو الخاصة عام وجهات النظر هي الآن على أساس طبقي.

التحديث:FWIW, لقد غيرت رأيي في الدرجة على أساس وجهات النظر منذ هذه الإجابة كانت مكتوبة.بعد أن استخدمها على نطاق واسع على عدة مشاريع ، أشعر أنها تميل إلى أن تؤدي إلى رمز مرضي الجافة الكتابة ، ولكن من الصعب جدا قراءة والحفاظ عليها في وقت لاحق ، لأن وظيفة تنتشر في الكثير من أماكن مختلفة فرعية تعتمد اعتمادا كبيرا على تنفيذ كل التفاصيل من superclasses ، mixins.أشعر الآن أن TemplateResponse وعرض الديكور أفضل إجابة المتحللة عرض التعليمات البرمجية.

نصائح أخرى

كنت بحاجة إلى استخدام فئة على أساس وجهات النظر ، ولكن أردت أن تكون قادرا على استخدام كامل اسم الفئة في URLconf دون الحاجة دائما إلى إنشاء مثيل فئة عرض قبل استخدامه.ما ساعدني كانت بسيطة من المستغرب 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)

يمكنني الآن كل مثيل الرأي الطبقات واستخدام الحالات كما عرض الوظائف أو يمكنني ببساطة نقطة بلدي URLconf إلى صفي و metaclass مثيل (والدعوة) فئة عرض بالنسبة لي.هذا يعمل عن طريق التحقق أول حجة __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/)

إذا كنت ببساطة عرض البيانات من النماذج ، لماذا لا تستخدم جانغو العامة وجهات النظر?فهي مصممة للسماح لك بسهولة عرض البيانات من النموذج دون الحاجة إلى كتابة وجهة نظرك الخاصة و الاشياء عن تعيين URL المعاملات إلى وجهات نظر, جلب البيانات, التعامل مع الحالات الحافة ، مما يجعل الانتاج ، إلخ.

يمكنك دائما إنشاء فئة تجاوز __call__ وظيفة ثم نقطة URL ملف مثيل من فئة.يمكنك أن تأخذ نظرة على FormWizard الطبقة لمعرفة كيفية القيام بذلك.

يبدو لي أنك تحاول الجمع بين الأشياء التي لا ينبغي أن تكون جنبا إلى جنب.إذا كنت في حاجة إلى معالجة مختلفة في طريقة العرض الخاصة بك اعتمادا على ما اذا كان المستخدم أو المجموعة الكائن أنت تحاول أن ننظر إلى ثم يجب عليك استخدام اثنين نظر مختلفة الوظائف.

من ناحية أخرى يمكن أن يكون هناك التعابير المشتركة أنك تريد استخراج من object_detail نوع وجهات النظر...ربما يمكن استخدام الديكور أو مجرد مساعد الوظائف ؟

-دان

إلا إذا كنت تريد أن تفعل شيئا قليلا معقدة باستخدام العامة وجهات النظر هي وسيلة للذهاب.فهي أقوى بكثير مما يوحي الاسم, و إذا كنت مجرد عرض نموذج بيانات عامة الآراء التي سيتم القيام بهذه المهمة.

عام الآراء عادة ما يكون وسيلة للذهاب ، ولكن في النهاية أنت حر في التعامل مع عناوين المواقع ولكن تريد.FormWizard يفعل أشياء في فئة على أساس طريقة ، كما تفعل بعض التطبيقات من أجل راحة واجهات برمجة التطبيقات.

في الأساس مع عنوان URL الذي يتم إعطاء مجموعة من المتغيرات على للاستدعاء ، ما للاستدعاء هو تماما متروك لكم - الطريقة القياسية هو توفير وظيفة - ولكن في نهاية المطاف جانغو يضع أي قيود على ما يمكنك القيام به.

أنا أوافق على أن بضعة أمثلة من كيفية القيام بذلك سوف تكون جيدة ، FormWizard ربما هو المكان المناسب للبدء على الرغم من.

إذا كنت تريد أن تشترك في الوظائف بين صفحات أقترح عليك البحث في العلامات المخصصة.إنهم تماما من السهل إنشاء, و هي قوية جدا.

أيضا ، قوالب يمكن أن تمتد من القوالب الأخرى.هذا يسمح لك أن يكون لها قاعدة قالب لإنشاء تخطيط الصفحة وتبادل هذه بين القوالب الأخرى التي تملأ الفراغات.يمكنك عش قوالب إلى أي عمق.مما يسمح لك لتحديد تخطيط على مجموعات منفصلة من الصفحات ذات الصلة في مكان واحد.

يمكنك استخدام جانغو العامة وجهات النظر.يمكنك بسهولة تحقيق الوظيفة المطلوبة شامل جانغو العامة وجهات النظر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top