от
Смотреть Джанго указывает на функцию, которая может быть проблемой, если вы хотите изменить только немного функциональности. Да, я мог бы миллион сайта Аргументы и даже больше, если высказывания в функции, но я думал больше о объектно-ориентированный подход. Например, у меня есть страница, которая отображает пользователю. Эта страница очень похожа на страницу, которая отображает группу, но это все-таки не настолько похожи, чтобы просто использовать другой модели данных. Группа также имеет членов и т. д... В одну сторону будет указывать вид методов классов, а затем расширить этот класс. Кто-нибудь пробовал этот подход или есть другие идеи?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

10 Ответы

0 голосов
от
Смотреть Джанго указывает на функцию, которая может быть проблемой, если вы хотите изменить только немного функциональности. Да, я мог бы миллион сайта Аргументы и даже больше, если высказывания в функции, но я думал больше о объектно-ориентированный подход. Например, у меня есть страница, которая отображает пользователю. Эта страница очень похожа на страницу, которая отображает группу, но это все-таки не настолько похожи, чтобы просто использовать другой модели данных. Группа также имеет членов и т. д... В одну сторону будет указывать вид методов классов, а затем расширить этот класс. Кто-нибудь пробовал этот подход или есть другие идеи?
0 голосов
от
Я создал и использовал свой собственный универсальный вид занятий, определение
__call__
так экземпляр класса является отзывной. Мне очень нравится, а Джанго общий вид можно настраивать по ключевым словам аргументы, ОО родовые представления (если их поведение не будет расчленена на ряд отдельных методов) может иметь гораздо более детальных настроек через подклассы, который позволяет мне повторяться намного меньше. (Я устаю от переписывания одного и того же создания/обновления просмотреть логику в любое время, мне нужно настроить что-то родовое видом на Джанго не очень позволяют). Я написал некоторый код в djangosnippets.org. Единственный реальный недостаток, который я вижу-это распространение внутренних вызовов методов, которые могут несколько повлиять на производительность. Я не думаю, что это большая проблема; это редкое, что выполнение кода на Python будет узким местом в производительности веб-приложения. Обновление: универсальным видом Джанго в настоящее время на основе классов. Обновление: чистки рядов, я изменил свое мнение о классе на основе представлений, так как этот ответ был написан. После того, как широко использовал их на пару проектов, я чувствую, что они, как правило, приводят к тому, что код сытно сухо писать, но очень трудно читать и поддерживать позже, потому что функциональность распространяется во многих разных местах, и подклассы настолько зависит от каждой реализации деталь из суперклассов и миксины. Теперь я чувствую, что TemplateResponse и посмотреть декораторов, это лучший ответ для разложения Просмотреть код.
0 голосов
от
Мне нужно, чтобы использовать класс на основе мнений, но я хотел бы быть в состоянии использовать полное имя класса, в мои url-конфигурации не всегда того, чтобы создать экземпляр класса просмотреть, прежде чем использовать его. Что помогло мне было удивительно прост метакласс:
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)
Я могу теперь как инстанцировать классы представления и использования экземпляров как вид функции, или я могу просто указать мой url-конфигурации в мой класс и метакласс создать (и назвать) класса представления для меня. Это работает путем проверки первого аргумента
__call__
– если это
HttpRequest
, это должно быть фактическое HTTP-запрос, потому что это будет бред попытку создать экземпляр класса вид с
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/)
0 голосов
от
Если вы просто отображение данных из модели, то почему бы не использовать универсальный вид Джанго? Они разработаны, чтобы позволить вам легко отображать данные из модели без необходимости писать свой собственный вид и материал о сопоставлении параметров URL-адрес для представления, извлечения данных, обработка кромкой случаях, вывода и т. д.
0 голосов
от
Вы всегда можете создать класс, переопределить функцию
__call__
и затем укажите файл URL-адрес экземпляра класса. Вы можете взглянуть на класс FormWizard, чтобы увидеть, как это делается.
0 голосов
от
Мне кажется, ты пытаешься совместить вещи, которые не должны быть объединены. Если вам нужно сделать различные обработки, на ваш взгляд, в зависимости от того, если это пользователь или группа объектов вы пытаетесь посмотреть, то вы должны использовать два разных вида функции. С другой стороны не может быть общих идиом вы хотите извлечь из своего объекта
0 голосов
от
Если вы хотите сделать что-то немного сложным, с использованием универсального представления являются способом пойти. Они являются гораздо более мощным, чем следует из их названия, и если вы не просто отображение модели данных общих представлений будет делать эту работу.
0 голосов
от
Универсальный вид, как правило, будет путь, но в конце концов вы вольны обрабатывать URL-адреса, однако вы хотите. FormWizard делает вещи в классе-так, как это делают некоторые приложения для спокойного Апис. В основном с URL, который вы дали кучу переменных и место, чтобы обеспечить вызываемой, вызываемую, что вы предоставляете полностью зависит от вас - стандартный способ-обеспечить функцию - но в конечном счете Джанго не накладывает никаких ограничений на то, что вы делаете. Я согласен, что еще несколько примеров, как это сделать, было бы хорошо, FormWizard, пожалуй, место, чтобы начать.
0 голосов
от
Если вы хотите поделиться общей функциональности между страницами я предлагаю вам взглянуть на пользовательские теги. Они довольно просты в создании, и очень мощный. Кроме того, шаблоны могут распространяться из других шаблонов. Это позволяет вам иметь базовый шаблон для настройки макета страницы и поделиться этим с другими шаблонами, которые заполняют пробелы. Вы можете шаблоны гнездо на любой глубине; позволяют определять расположение отдельных групп связанных страниц в одном месте.
0 голосов
от
Вы можете использовать универсальный вид Джанго. Вы можете легко достигнуть требуемой функциональности тщательного универсальный вид Джанго
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...