просмотров классов в Django

голоса
48

Джанго точки зрения на функцию, которая может быть проблемой , если вы хотите изменить только немного функциональности. Да, я мог бы иметь миллион именованных аргументов и даже больше , если заявления в функции, но я больше думал о подходе объектно - ориентированном.

Например, у меня есть страница, которая показывает пользователю. Эта страница очень похожа на страницу, которая отображает группу, но она по-прежнему не очень похожа просто использовать другую модель данных. Группа также имеет членов и т.д. ...

Одним из способов было бы указать вид на методы класса, а затем продлить этот класс. Кто-нибудь пробовал этот подход или имеет любую другую идею?

Задан 03/08/2008 в 16:55
источник пользователем
На других языках...                            


9 ответов

голоса
41

Я создал и использовал свои собственные обобщенные классы представлений, определяя __call__таким образом экземпляр класса отозван. Мне это и вправду нравится; в то время как общие взгляды Django позволяют некоторые настройки с помощью именованных аргументов, OO общие представления (если их поведение разбивается на ряд отдельных методов) могут иметь гораздо более мелкозернистые настройки через подклассы, что позволяет мне повторить себя намного меньше. (Устаю переписывания же создать / обновить вид логики в любое время мне нужно настроить что - то общие взгляды Джанго не вполне позволяют).

Я отправил код в djangosnippets.org .

Единственный реальный недостаток я вижу, это распространение внутренних вызовов методов, которые могут повлиять на производительность несколько. Я не думаю, что это большая проблема; это редко, что выполнение кода Python будет узким местом производительности в веб-приложение.

UPDATE : собственные Джанго общие взгляды в настоящее время на основе классов.

UPDATE : FWIW, я изменил свое мнение по поводу взглядов на основе классов , так как этот ответ был написан. После того , как использовали их экстенсивно на несколько проектов, я чувствую , что они , как правило, приводят к коду , который удовольствию DRY писать, но очень трудно читать и поддерживать позже, поскольку функциональность распространяется через так много различных мест, и подклассы настолько зависимы на каждой детали реализации суперкласса и Mixins. Теперь я чувствую , что TemplateResponse и просматривать декораторы является лучшим ответом для разложения вида кода.

Ответил 29/08/2008 в 05:29
источник пользователем

голоса
13

Мне нужно использовать представления на основе класса, но я хотел бы быть в состоянии использовать полное имя класса в моих привязках, не всегда того, чтобы создать экземпляр класса вида, прежде чем использовать его. Что помогло мне было удивительно просто метаклассом:

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 к моему классу и имеют метакласса Instantiate (и называют) класс вида для меня. Это работает, проверив первый аргумент __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 базовых представлений ? Они разработаны , чтобы позволить вам легко показать данные модели без необходимости писать свой собственный вид и материал о отображении URL PARAMATERS на представления, Извлечение данных, обработки крайних случаев, оказывающую продукции и т.д.

Ответил 07/08/2008 в 11:44
источник пользователем

голоса
3

Вы всегда можете создать класс, переопределить __call__функцию , а затем указать файл URL к экземпляру класса. Вы можете посмотреть на Мастер форм класса , чтобы увидеть , как это делается.

Ответил 26/08/2008 в 12:38
источник пользователем

голоса
2

Если вы не хотите сделать что-то немного комплекса, используя общие взгляды являются путь. Они гораздо более мощные, чем следует из их названий, и если вы просто отображать общие взгляды модели данных будут делать эту работу.

Ответил 11/08/2008 в 23:59
источник пользователем

голоса
2

Звуки для меня, как вы пытаетесь сочетать вещи, которые не должны быть объединены. Если вам нужно сделать различную обработку на ваш взгляд, в зависимости от того, если это пользователь или группа объект, который вы пытаетесь посмотреть, то вы должны использовать две различные функции просмотра.

С другой стороны, может быть общими идиомами вы хотите, чтобы извлечь из ваших object_detail взглядов типа ... возможно, вы могли бы использовать декоратор или только вспомогательные функции?

Дан

Ответил 03/08/2008 в 18:40
источник пользователем

голоса
1

Вы можете использовать Django базовые представления. Вы можете легко достичь желаемой функциональность тщательного Django общих Просмотров

Ответил 08/10/2014 в 06:53
источник пользователем

голоса
1

Общие виды, как правило, путь, но в конечном итоге вы свободны для обработки URL, однако вы хотите. Делают вещи Мастера форм в пути на основе классов, как это делают некоторые приложения для RESTful API.

В основном с URL вы получаете кучу переменных и место, чтобы обеспечить вызываемые, чем отзывные вы предоставите полностью зависит от вас - стандартный способа для обеспечения функции - но в конечном счете, Django не накладывает никаких ограничений на то, что вы делаете.

Я согласен, что еще несколько примеров того, как сделать это было бы хорошо, вероятно, Мастер форм место для начала, хотя.

Ответил 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