django don't do this - djangotoronto - january, 2012
DESCRIPTION
TRANSCRIPT
![Page 2: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/2.jpg)
Who am I?
Friday, 20 January, 12
![Page 3: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/3.jpg)
Systems Analyst
Friday, 20 January, 12
![Page 4: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/4.jpg)
Senior Developer and Team Lead
Friday, 20 January, 12
![Page 5: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/5.jpg)
Senior Developer
Friday, 20 January, 12
![Page 6: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/6.jpg)
What is this talk about?
Friday, 20 January, 12
![Page 7: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/7.jpg)
Common Mistakes
Friday, 20 January, 12
![Page 8: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/8.jpg)
Common mistakes as a result of gaining more experience
with Django
Friday, 20 January, 12
![Page 9: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/9.jpg)
Common mistakes as a result of gaining more experience
with Django
(in no particular order)
Friday, 20 January, 12
![Page 10: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/10.jpg)
Friday, 20 January, 12
![Page 11: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/11.jpg)
Don’t be *this* guy.
Friday, 20 January, 12
![Page 12: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/12.jpg)
Defining Models without indexes
Friday, 20 January, 12
![Page 13: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/13.jpg)
DON’T forget your indexes
Friday, 20 January, 12
![Page 14: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/14.jpg)
Models
Friday, 20 January, 12
![Page 15: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/15.jpg)
ModelsThey define your data.
Friday, 20 January, 12
![Page 16: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/16.jpg)
ModelsThey don’t define behavior.
Friday, 20 January, 12
![Page 17: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/17.jpg)
ModelsThey can’t read your mind.
Friday, 20 January, 12
![Page 18: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/18.jpg)
Even seasoned Django developers forget about
indexes
Friday, 20 January, 12
![Page 19: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/19.jpg)
Remember this?
Friday, 20 January, 12
![Page 20: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/20.jpg)
Remember this?
Friday, 20 January, 12
![Page 21: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/21.jpg)
DO add indexes to your Models.
Friday, 20 January, 12
![Page 22: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/22.jpg)
Over-Indexing
Friday, 20 January, 12
![Page 23: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/23.jpg)
DON’T index everything
Friday, 20 January, 12
![Page 24: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/24.jpg)
What are indexes?
Friday, 20 January, 12
![Page 25: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/25.jpg)
What are indexes?They are pointers to your data
Friday, 20 January, 12
![Page 26: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/26.jpg)
What are indexes?They are pointers to your data
... in memory
Friday, 20 January, 12
![Page 27: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/27.jpg)
What are indexes?They are pointers to your data
... in memory
... or on disk!!!
Friday, 20 January, 12
![Page 28: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/28.jpg)
They slow down inserts, updates and deletes.
Friday, 20 January, 12
![Page 29: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/29.jpg)
As a general rule, you want an index on
anything you will use to limit results
Friday, 20 January, 12
![Page 30: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/30.jpg)
As a general rule, you want an index on
anything you will use to limit results
... but generalizations break down quickly.
Friday, 20 January, 12
![Page 31: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/31.jpg)
You need to assess your specific needs.
Friday, 20 January, 12
![Page 32: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/32.jpg)
DO analyze your QuerySets
to determine where indexes
are needed.Friday, 20 January, 12
![Page 33: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/33.jpg)
Silly Shortcuts
Friday, 20 January, 12
![Page 34: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/34.jpg)
DON’T use locals() to
populate your context
Friday, 20 January, 12
![Page 35: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/35.jpg)
I PITY THE FOOL...WHO HAS TO DEBUG
YOUR TEMPLATE
Friday, 20 January, 12
![Page 36: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/36.jpg)
It’s not clever.
Friday, 20 January, 12
![Page 37: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/37.jpg)
It’s just lazy.
Friday, 20 January, 12
![Page 38: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/38.jpg)
Every time you use locals() to populate your
context, God kills a kitten.Friday, 20 January, 12
![Page 39: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/39.jpg)
def my_view(request):! users = User.objects.filter(active=True)! num_users = len(users)
! message = None! if num_users > 3:! ! message = "Three's a crowd." context = locals()! return render_to_response( '/path/to/template.html', context)
Friday, 20 January, 12
![Page 40: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/40.jpg)
def my_view(request):! users = User.objects.filter(active=True)! num_users = len(users)
! message = None! if num_users > 3:! ! message = "Three's a crowd." context = locals()! return render_to_response( '/path/to/template.html', context)
Thumbs down!
Friday, 20 January, 12
![Page 41: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/41.jpg)
context = {'context': <Recursion on dict with id=175092300>, 'ipdb': <module 'ipdb' from '/home/vagrant/.virtualenvs/wave/lib/python2.6/site-packages/ipdb/__init__.pyc'>, 'message': "Three's a crowd.", 'num_users': 9, 'pprint': <function pprint at 0x8a88f44>, 'request': <WSGIRequestGET:<QueryDict: {}>,POST:<QueryDict: {}>,COOKIES:{'__utma': '111872281.606618788.1318529036.1326747382.1326750603.150', '__utmc': '111872281', '__utmz': '111872281.1318529036.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'csrftoken': '********************************', 'sessionid': '********************************'},META:{'CELERY_LOADER': 'djcelery.loaders.DjangoLoader', 'CONTENT_LENGTH': '', 'CONTENT_TYPE': 'text/plain', 'CSRF_COOKIE': '********************************', 'DJANGO_SETTINGS_MODULE': 'waveaccounting.settings', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HOME': '/home/vagrant', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'csrftoken=********************************; __utma=111872281.606618788.1318529036.1326747382.1326750603.150; __utmz=111872281.1318529036.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); sessionid=********************************; __utmc=111872281', 'HTTP_HOST': 'localhost:8000', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1', 'LANG': 'en_US.UTF-8', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'LOGNAME': 'vagrant',
Friday, 20 January, 12
![Page 42: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/42.jpg)
'LS_COLORS': 'rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:', 'MAIL': '/var/mail/vagrant', 'OLDPWD': '/home/vagrant', 'PATH': '/home/vagrant/.virtualenvs/wave/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/ruby/bin/', 'PATH_INFO': u'/en/settings/business/1/', 'PIP_RESPECT_VIRTUALENV': 'true', 'PS1': '(wave)\\[\\e]0;\\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ ', 'PWD': '/home/vagrant/Projects/wa/waveaccounting', 'QUERY_STRING': '', 'REMOTE_ADDR': '10.0.2.2', 'REMOTE_HOST': '', 'REQUEST_METHOD': 'GET', 'RUN_MAIN': 'true', 'SCRIPT_NAME': u'', 'SERVER_NAME': 'lucid32', 'SERVER_PORT': '8000', 'SERVER_PROTOCOL': 'HTTP/1.1',
Friday, 20 January, 12
![Page 43: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/43.jpg)
'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.6.5', 'SHELL': '/bin/bash', 'SHLVL': '1', 'SSH_CLIENT': '10.0.2.2 50056 22', 'SSH_CONNECTION': '10.0.2.2 50056 10.0.2.15 22', 'SSH_TTY': '/dev/pts/2', 'TERM': 'xterm-256color', 'TZ': 'America/Toronto', 'USER': 'vagrant', 'VIRTUALENVWRAPPER_HOOK_DIR': '/home/vagrant/.virtualenvs', 'VIRTUALENVWRAPPER_LOG_DIR': '/home/vagrant/.virtualenvs', 'VIRTUAL_ENV': '/home/vagrant/.virtualenvs/wave', 'WORKON_HOME': '/home/vagrant/.virtualenvs', '_': '/home/vagrant/.virtualenvs/wave/bin/python', 'wsgi.errors': <open file '<stderr>', mode 'w' at 0xb77600d0>, 'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>, 'wsgi.input': <socket._fileobject object at 0x9c602ec>, 'wsgi.multiprocess': False, 'wsgi.multithread': True, 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.version': (1, 0)}>, 'users': [<User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: [email protected]>, <User: >, <User: [email protected]>]}
Friday, 20 January, 12
![Page 44: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/44.jpg)
Weird stuff happens.
Friday, 20 January, 12
![Page 45: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/45.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
Friday, 20 January, 12
![Page 46: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/46.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
context
Friday, 20 January, 12
![Page 47: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/47.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
context [‘context’]
Friday, 20 January, 12
![Page 48: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/48.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
context [‘context’] [‘context’]
Friday, 20 January, 12
![Page 49: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/49.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
context [‘context’] [‘context’] [‘context’]
Friday, 20 January, 12
![Page 50: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/50.jpg)
Did you notice? 'context': <Recursion on dict with id=175092300>
context [‘context’] [‘context’] [‘context’] ...
Friday, 20 January, 12
![Page 51: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/51.jpg)
Please... do it this way!def my_view(request):! users = User.objects.filter(active=True)! num_users = len(users)
! message = None! if num_users > 3:! ! message = "Three's a crowd."
! context = {! ! 'message' : message,! }! return render_to_response( '/path/to/template.html', context)
Friday, 20 January, 12
![Page 52: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/52.jpg)
DO define your context explicitly
Friday, 20 January, 12
![Page 53: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/53.jpg)
Replacing the .all() method on QuerySets
Friday, 20 January, 12
![Page 54: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/54.jpg)
DON’T replace get_query_set()
with something unexpected.
Friday, 20 January, 12
![Page 55: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/55.jpg)
The majority of developers and apps expect objects.all() to
return ALL objects.
Friday, 20 January, 12
![Page 56: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/56.jpg)
That’s why it’s called .all()
Friday, 20 January, 12
![Page 57: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/57.jpg)
EXAMPLE
class CustomQuerySet(QuerySet): def active(self): return self.filter(is_active=True)
class MyManager(models.Manager): def get_query_set(self): return CustomQuerySet(self.model)
Friday, 20 January, 12
![Page 58: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/58.jpg)
To get the active users:
MyModel.objects.active()
Friday, 20 January, 12
![Page 59: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/59.jpg)
What about in the admin?
Friday, 20 January, 12
![Page 60: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/60.jpg)
What about in the admin?
class CustomModelAdmin(admin.ModelAdmin):
def queryset(self, request): “”” Only superusers can access all objects in the admin. “”” qs = super(CustomModelAdmin, self).queryset(request) if not request.user.is_superuser: qs = qs.active() return qs
Friday, 20 January, 12
![Page 61: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/61.jpg)
DO explicitly define your QuerySets
Friday, 20 January, 12
![Page 62: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/62.jpg)
Creating new ways to do the same things.
Friday, 20 January, 12
![Page 63: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/63.jpg)
DON’T invent new Django
conventions.
Friday, 20 January, 12
![Page 64: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/64.jpg)
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 65: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/65.jpg)
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 66: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/66.jpg)
are you sure that'sa good idea?are you sure that'sa good idea?are you sure that'sa good idea?are you sure that'sa good idea?
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 67: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/67.jpg)
i think its a really goodusage patterni think its a really goodusage patterni think its a really goodusage patterni think its a really goodusage pattern
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 68: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/68.jpg)
your POST data doesn'tnecessarily exist.your POST data doesn'tnecessarily exist.your POST data doesn'tnecessarily exist.your POST data doesn'tnecessarily exist.
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 69: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/69.jpg)
oh... crapoh... crapoh... crapoh... crap
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 70: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/70.jpg)
pwned you!pwned you!pwned you!pwned you!
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 71: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/71.jpg)
............
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 72: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/72.jpg)
FOLLOW THE PATTERN, BITCHES!FOLLOW THE PATTERN, BITCHES!FOLLOW THE PATTERN, BITCHES!FOLLOW THE PATTERN, BITCHES!
Even the best Django developers make this mistake
Friday, 20 January, 12
![Page 73: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/73.jpg)
DO follow the conventions
outlined by the Django community
Friday, 20 January, 12
![Page 74: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/74.jpg)
They have more experience than you
do.
Friday, 20 January, 12
![Page 75: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/75.jpg)
They have built more projects than you have.
Friday, 20 January, 12
![Page 76: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/76.jpg)
They know better than you do.
Friday, 20 January, 12
![Page 77: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/77.jpg)
Tell me I’m wrong
Friday, 20 January, 12
![Page 78: Django Don't Do This - DjangoToronto - January, 2012](https://reader034.vdocuments.mx/reader034/viewer/2022051818/54bb82c14a79597d0f8b459f/html5/thumbnails/78.jpg)
Tell me I’m wrong
@ashchristopher
Friday, 20 January, 12