Django: изменение поля стандартного вида
Всем снова привет. Как это ни странно сейчас все мое внимание уделено исключительно разработке приложений основанных на web framework Django. Причиной перехода на django является разработке и ведению нового проекта, который наша компания делает для украинской компании. Надеюсь что мы выиграем с этим проектом.
Но это всего лишь отступление. Важной частью разработки является кастомизация некоторых элементов любого сайта использующих какой-бы то ни было фреймворк. Будь то Smarty, Zend Framework, Symphony. Без разницы, все они предоставляют строгий набор элементов, которые используются в проекте. А что делать если нас не устраивает этот набор и необходимо пополнить его своими причиндалами.
В django 1.0 были сделаны некоторые очень полезные добавления, которых я ждал. Введение save_model метода в ModelAdmin класс избавило от написания менеджеров. Что же дает нам ModelAdmin для кастомизации полей?
Любой вам даст совет рыть исходники Django, и что собственно и было сделано. В ModelAdmin есть метод get_form который вернет экземпляр класса формы которая используется в административном интерфейсе. А что если переопределить эту функцию? Выйдет примерно следующее
-
class MyModelAdmin(admin.ModelAdmin):
-
list_display = (‘title’, ‘latin_title’, ‘recipe’)
-
prepopulated_fields = {"url": ("latin_title", )}
-
-
form = MyModelAdminForm
-
-
def get_form(self, request, obj=None, **kwargs):
-
form = super(MyModelAdmin, self).get_form(request, obj=None, **kwargs)
-
-
form.base_fields[‘custom’].widget = MyWidget(obj)
-
return form
-
-
admin.site.register(Medicine, MedicineAdmin)
То что доктор прописал, не так ли? Данного подхода в документации я не нашел, зато на сайте http://djangosnippets.org есть отличный пример, который использует подобную технику.
