Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Django Admin: Widgetry & Witchery
Search
Pamela Fox
August 31, 2012
Technology
4
1.4k
Django Admin: Widgetry & Witchery
Why we chose to use Django admin, and how it worked, and, well, how it didn't work.
Pamela Fox
August 31, 2012
Tweet
Share
More Decks by Pamela Fox
See All by Pamela Fox
Building a RAG-poweredAI chat appwith Python and VS Code
pamelafox
0
130
Building a RAG app to chat with your data (on Azure)
pamelafox
3
430
Automated evaluations of LLM apps with azure-ai-generative SDK
pamelafox
0
85
AI Chat App Hack: Continuous Deployment of your Chat App
pamelafox
0
93
AI Chat App Hack: Evaluating a Chat App
pamelafox
0
140
Azure AI Search Best Practices for RAG Chat Apps
pamelafox
0
290
Customizing your RAG Chat App
pamelafox
0
350
AI Chat App Hack: Building a RAG Chat App
pamelafox
0
560
Vector search and retrieval for Generative AI app (Microsoft AI Tour SF)
pamelafox
0
920
Other Decks in Technology
See All in Technology
一生覚えておきたい「システム開発=コミュニケーション」〜初めての実務案件振り返りLT〜
maimyyym
2
240
データベース02: データベースの概念
trycycle
0
170
VSCodeの拡張機能を作っている話
ebarakazuhiro
1
700
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
BPStudyの200回を中心にIT業界を振り返る。そしてこれから
haru860
3
360
推しは推せるときに推せ! プロダクトにフィードバックしていこう
nakasho
0
440
ルーターでプレゼンする
puhitaku
1
3.1k
The AI Revolution Will Not Be Monopolized: Behind the scenes
inesmontani
PRO
1
140
Além do else! Categorizando Pokemóns com Pattern Matching no JavaScript
wmsbill
0
680
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
190
プラットフォームってつくることより計測することが重要なんじゃないかという話 / Platform Engineering Meetup #8
taishin
1
390
Microsoft Intune 勉強会 第 2 回目
tamaiyutaro
2
340
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
17
1.6k
Debugging Ruby Performance
tmm1
70
11k
For a Future-Friendly Web
brad_frost
172
9k
Making Projects Easy
brettharned
109
5.5k
What's in a price? How to price your products and services
michaelherold
238
11k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
228
16k
The Power of CSS Pseudo Elements
geoffreycrofte
61
5k
GitHub's CSS Performance
jonrohan
1025
450k
Agile that works and the tools we love
rasmusluckow
325
20k
Being A Developer After 40
akosma
64
580k
The Mythical Team-Month
searls
216
42k
Optimising Largest Contentful Paint
csswizardry
11
2.4k
Transcript
Django Admin Widgetry & Witchery Pamela Fox @pamelafox Thursday, August
30, 12
Coursera: What we do Thursday, August 30, 12
Our Backend Thursday, August 30, 12
Why We Need Admin Thursday, August 30, 12
Why Django Admin? Creates forms for adding/editing/searching models Restricts fields
based on admin roles Thursday, August 30, 12
How Django Admin Works https://docs.djangoproject.com/en/dev/ref/contrib/admin/ from django.contrib import admin from
app import admin from app.courses.models import Course from app.courses.forms import CourseAdminForm class CourseAdmin(ModelAdmin): base_model = Course restrict_fields = ['instructors', 'teaching_assistants', ] form = CourseAdminForm fieldsets = [ (None, { 'fields': [ 'name', 'topic', 'active', ] }), ('Dates', { 'fields': [ 'start_date', 'end_date', 'start_date_string', 'duration_string', ] }) ] admin.site.register(Course, CourseAdmin) Thursday, August 30, 12
...And a few words on how it doesn’t work. Thursday,
August 30, 12
☹: The Look & Feel != Thursday, August 30, 12
Solution: Twitter Bootstrap https://github.com/gkuhn1/django-admin-templates-twitter-bootstrap Thursday, August 30, 12
☹: The Default Widgets BooleanField CharField ChoiceField TypedChoiceField DateField DateTimeField
DecimalField EmailField FileField FilePathField FloatField ImageField IntegerField IPAddressField GenericIPAddressField MultipleChoiceField TypedMultipleChoiceField NullBooleanField RegexField SlugField TimeField URLField ComboField MultiValueField SplitDateTimeField ModelChoiceField ModelMultipleChoiceField Thursday, August 30, 12
Solution: Custom Widgets WysiHTMLEditor TransloaditUpload UniqueShortName NumberField NumberRangeField AutoCompleteTextInput Thursday,
August 30, 12
Custom Widgets class NumberField(HiddenInput): class Media: js = ( settings.ADMIN_MEDIA_PREFIX
+ 'js/numberfields.js', ) def render(self, name, value, attrs=None): input = super(NumberField, self).render(name, value, attrs=attrs) final_attrs = self.build_attrs(attrs) units = final_attrs.get('units', '') html = u""" <div class="number-field"> %(input)s <input type="number" min="1" class="number-range-field-num input-mini"> <span class="number-range-field-units">%(units)s<span> </div> """ % {'input': input, 'units': units} return mark_safe(html) admin/common/widgets.py: from django.forms import ModelForm from app.common.widgets import NumberField class CourseAdminForm(ModelForm): class Meta: widgets = { 'duration_string': NumberField( attrs={'units': 'weeks'}) } course/forms.py from app import admin from app.courses.models import Course from app.courses.forms import CourseAdminForm class CourseAdmin(ModelAdmin): base_model = Course form = CourseAdminForm course/admin.py Thursday, August 30, 12
☹: Default Save Options != Thursday, August 30, 12
Solution: Horrible Hacks var topicPageRegEx = /\/topics\/topic\//i; var isTopicPage =
topicPageRegEx.exec(window.location.href); if (isTopicPage) { var previewHosts = {'admin': 'site', 'admin.coursera.org': 'www.coursera.org'}; var previewUrl = 'http://' + previewHosts[window.location.host] + '/course/' + $ ('input[name="short_name"]').val(); var $previewUrl = $('<input type="hidden" name="_previewurl">').val(previewUrl); var $previewButton = $('<input type="submit" name="_saveandpreview" value="Save and Preview" class="btn btn-info">'); var $saveButton = $('.form-actions input[name="_save"]') $saveButton.after(' ').after($previewButton) .after(' ').after($previewUrl); } templates/admin/change_form.html if "_saveandpreview" in request.POST: return HttpResponseRedirect(request.POST['_previewurl']) admin/options.py Thursday, August 30, 12
In conclusion... Thursday, August 30, 12
Our Future Admin Stack? https://github.com/PaulUithol/backbone-tastypie https://github.com/joshbohde/django-backbone-example Thursday, August 30, 12