Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2014 19:00:21

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Повторяющиеся данные

Настало время задуматься о DRY.
Подскажите как все это сократить?

urls.py

url(r'^1/$', View1List.as_view(), name='view_1_list'),
url(r'^1/(?P<pk>\d+)/$', View1Item.as_view(), name='view_1_item'),
url(r'^1/list/$', Cabinet1List.as_view(), name='cabinet_1_list'),
url(r'1/add/$', Cabinet1Add.as_view(), name='cabinet_1_add'),
url(r'^1/(?P<pk>\d+)/edit/$', Cabinet1Edit.as_view(), name='cabinet_1_edit'),
url(r'^1/(?P<pk>\d+)/del/$', Cabinet1Del.as_view(), name='cabinet_1_del'),
url(r'^1/(?P<pk>\d+)/hide/$', Cabinet1Hide.as_view(), name='cabinet_1_hide'),
...
это только по одному типу данных, в данном случае это 1, а их там штук 10

во вьюхе это все умножается
class Cabinet1Hide(CabinetHide):
    model = 1
    success_url = reverse_lazy('reals:cabinet_1_list')
class Cabinet2Hide(CabinetHide):
    model = 2
    success_url = reverse_lazy('reals:cabinet_2_list')
class Cabinet3Hide(CabinetHide):
    model = 3
    success_url = reverse_lazy('reals:cabinet_3_list')
class Cabinet4Hide(CabinetHide):
    model = 4
    success_url = reverse_lazy('reals:cabinet_4_list')
class Cabinet5Hide(CabinetHide):
    model = 5
    success_url = reverse_lazy('reals:cabinet_5_list')
и это только для DELETE, там еще ADD, EDIT, LIST…

Отредактировано info.rss (Сен. 27, 2014 19:01:01)

Офлайн

#2 Сен. 27, 2014 19:49:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Повторяющиеся данные

Если у вас CBV, то делаем общий класс для всех остальных вьюх проекта. Помимо очевидных ништяков, таких как централизованное управление правами доступа или внедрение констант в контекст без костылей, мы можем сделать что то типа

# -*- coding: utf-8 -*-
import pkgutil
from django.conf.urls import patterns, url
import os
from vist_core.generics.base import get_module_views
def get_patterns(_file):
    urls_path = os.path.dirname(_file)
    module_name = os.path.basename(urls_path)
    views_path = os.path.join(urls_path, "views")
    urls = []
    for params in pkgutil.iter_modules([views_path]):
        view_file_name = params[1]
        __import__('%s.views.%s' % (module_name, view_file_name))
    for view_class in get_module_views(module_name):
        slug_name = view_class.get_slug_name()
        _url = url(r'^%s/$' % slug_name, view_class.as_view(), name=slug_name)
        urls.append(_url)
        urls.append(_hidden_url)
    urlpatterns = patterns('', *urls)
    return urlpatterns

То есть используем __subclasses__ у базового класса, получаем всех потомков, выдергиваем у них некий декларативный атрибут name и строим по нему url.



Отредактировано FishHook (Сен. 27, 2014 19:52:17)

Офлайн

#3 Сен. 28, 2014 08:47:48

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Повторяющиеся данные

Спасибо, это пока сложно, но стараюсь разбираться
подскажите

from vist_core.generics.base import get_module_views
это откуда, или о чем), т.к
ImportError: No module named vist_core.generics.base

Отредактировано info.rss (Сен. 28, 2014 08:51:30)

Офлайн

#4 Сен. 28, 2014 13:41:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Повторяющиеся данные

Напишите мне на мыло.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version