Выпустил в свет инструмент для более удобного создания CRUD-based приложений на Django: github.com/05bit/django-smarter.
Для чего это нужно? Бывает, что приложение состоит из однотипных страниц — создать, удалить, посмотреть объект, список объектов. При этом, функционал стандартной админки уже тесен, так как нужен более хитрый интерфейс и не всегда стандартная логика.
Да, есть Generic views, но это все равно достаточно много однотипного кода, что быстро приводит к огульному копи-пасту.
Пример использования — взят из документации.
Опишем простую модель:
class Page(models.Model): title = models.CharField(max_length=100) text = models.TextField def __unicode__(self): return self.name
И дальше в urls.py:
from smarter import SmarterSite from myapp.models import Page site = SmarterSite() site.register(Page) urlpatterns = patterns('', url(r'^', include(site.urls)), # other urls ... )
Шаблоны подцепляются автоматически по схеме [app]/[model]_[action].html, нужно их только создать.
Дальше, при необходимости можно писать собственные view-классы. Из приятных, но пока недокументированных возможностей — кастомизация форм.
Например, с добавлением view-метода:
from smarter.views import GenericViews from myapp.models import Page class PageViews(GenericViews): model = Page form_opts = { 'edit': { 'exclude': ('title',), } } @property def urlpatterns(self): urlatterns = super(PageViews, self).urlpatterns + patterns('', url(r'^(?P<pk>d+)/bookmark/$', self.as_view('bookmark'), name=self.url_name('bookmark')), ) return urlatterns def bookmark_view(self, request, pk): obj = get_object_or_404(page, pk=pk) # do some stuff for bookmarking ... context = {'obj': obj} # will render to myapp/page_bookmark.html return self.render_to_response(context)
И дальше в urls.py:
from smarter import SmarterSite from myapp.views import PageViews site = SmarterSite() site.register(PageViews) urlpatterns = patterns('', url(r'^', include(site.urls)), # other urls ... )
Удобно так же, например, сделать общий функционал для всех view в базовом классе, и потом наследовать от него. Например — повесить декоратор login_required или типичную для приложения обработку ajax-запросов.
Надеюсь, кому-то будет полезно.
Так же, на документацию пока нет достаточно сил и времени, буду рад помощи в виде pull request-ов. А так же готов отвечать на простые вопросы, в духе «А предусмотрено ли то-то?» или «Есть ли пример как сделать что-то?»
Всем привет!
Автор: rudyryk