Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Представления классов в Django
Django вид указывает на функцию, которая может быть проблемой, если вы хотите изменить только немного функциональности. Да, я мог бы иметь миллион аргументов ключевых слов и даже больше операторов if в функции, но я больше думал об объектно-ориентированном подходе.
Например, у меня есть страница, на которой отображается пользователь. Эта страница очень похожа на страницу, которая отображает группу, но она все еще не настолько похожа, чтобы просто использовать другую модель данных. Группа также имеет членов и т. д...
Одним из способов было бы указать представления на методы класса, а затем расширить этот класс. Пробовал ли кто-нибудь этот подход или у него есть другие идеи?
Я создал и использовал свои собственные универсальные классы представлений, определив __call__ , чтобы экземпляр класса можно было вызвать. Мне это очень нравится; в то время как универсальные представления Django допускают некоторую настройку с помощью аргументов ключевых слов, универсальные представления OO (если их поведение разбито на несколько отдельных методов) могут иметь гораздо более тонкую настройку с помощью подклассов, что позволяет мне повторять себя намного меньше. (Я устаю переписывать одну и ту же логику создания/обновления представлений в любое время, когда мне нужно настроить что-то, что общие представления Django не совсем позволяют).
Я отправил код по адресу djangosnippets.org .
Единственный реальный недостаток, который я вижу, - это распространение внутренних вызовов методов, что может несколько повлиять на производительность. Я не думаю, что это сильно беспокоит; редко бывает, чтобы выполнение кода Python было вашим узким местом производительности в веб-приложении.
UPDATE : собственные универсальные представления Django теперь основаны на классах.
UPDATE : FWIW, я изменил свое мнение о классовых представлениях с тех пор, как был написан этот ответ. После того, как я широко использовал их в нескольких проектах, я чувствую, что они обычно приводят к коду, который удовлетворительно DRY писать, но очень трудно читать и поддерживать позже, потому что функциональность распределена по очень многим различным местам, и подклассы так зависят от каждой детали реализации суперклассов и миксинов. Теперь я чувствую, что TemplateResponse и view decorators-это лучший ответ для декомпозиции кода представления.
Мне нужно было использовать представления на основе классов, но я хотел иметь возможность использовать полное имя класса в моем 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, потому что было бы глупо пытаться создать экземпляр класса представления с экземпляром 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/ )
Если вы просто отображаете данные из моделей, Почему бы не использовать общие представления Django ? Они предназначены для того, чтобы вы могли легко отображать данные из модели без необходимости писать свое собственное представление и прочее о сопоставлении URL paramaters с представлениями, извлечении данных, обработке граничных случаев, выводе результатов визуализации и т. д.
Вы всегда можете создать класс, переопределить функцию __call__ и затем указать файл URL на экземпляр класса. Вы можете взглянуть на класс FormWizard , чтобы увидеть, как это делается.
Мне кажется, что ты пытаешься объединить вещи, которые не должны быть объединены. Если вам нужно выполнить различную обработку в вашем представлении в зависимости от того, является ли это объект пользователя или группы, на который вы пытаетесь посмотреть, то вы должны использовать две разные функции представления.
С другой стороны, могут быть общие идиомы, которые вы хотели бы извлечь из ваших представлений типа object_detail... возможно, вы могли бы использовать декоратор или просто вспомогательные функции?
-Дан
Если вы хотите поделиться общей функциональностью между страницами, я предлагаю вам посмотреть на пользовательские теги. Их довольно легко создать, и они очень мощные.
Кроме того, шаблоны могут расширяться из других шаблонов . Это позволяет вам иметь базовый шаблон для настройки макета страницы и совместно использовать его между другими шаблонами, которые заполняют пробелы. Вы можете вложить шаблоны на любую глубину, что позволит вам задать макет на отдельных группах связанных страниц в одном месте.
Общие представления, как правило, будут идти по этому пути, но в конечном счете вы можете обращаться с URLs, как вам угодно. FormWizard делает все на основе класса, как и некоторые приложения для RESTful APIs.
В основном с URL вам дается куча переменных и место для предоставления вызываемого объекта, то, что вы предоставляете вызываемому объекту, полностью зависит от вас - стандартный способ заключается в предоставлении функции - но в конечном счете Django не накладывает никаких ограничений на то, что вы делаете.
Я действительно согласен, что еще несколько примеров того, как это сделать, было бы неплохо, FormWizard, вероятно, это место для начала.