SlideShare a Scribd company logo
Django 
user permissions 
in your templates 
A nice little Django template tag pattern
The task 
On the frontend 
display an “edit” link 
for the owner of an object and 
for super users.
Version A 
{% if user.is_authenticated %} 
{% if user.is_superuser %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% else %} 
{% if my_obj.user == user %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %} 
{% endif %} 
{% endif %}
Version A 
{% if user.is_authenticated %} 
{% if user.is_superuser %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% else %} 
{% if my_obj.user == user %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %} 
{% endif %} 
{% endif %}
Version B 
{% if user.is_authenticated and my_obj.user == user or 
user.is_superuser %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %}
Version B 
{% if user.is_authenticated and my_obj.user == user or 
user.is_superuser %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %}
Version C 
{% if user|can_edit:my_obj %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %}
Version C 
{% if user|can_edit:my_obj %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %} 
Way better!
Version C: 
{% if user|can_edit:my_obj %} 
<a href="{% url 'my_obj:edit' my_obj.id %}"> 
Edit object 
</a> 
{% endif %}
The custom template tag 
from django import template 
register = template.Library() 
@register.filter 
def can_edit(user, obj): 
user_can_edit = False 
if user.is_authenticated: 
if user.is_superuser: 
user_can_edit = True 
else: 
if obj and obj.user and obj.user == user: 
user_can_edit = True 
return user_can_edit
More applications for this pattern 
{% if user|can_delete:my_object %} 
{% if user|is_in_group:group %} 
{% if event|is_attended_by:user %} 
{% if user|has_been_at:place %} 
{% if place|is_in_favorites_of:user %} 
{% if article|has_been_flagged_by:user %}
Thank you for listening! 
Anton Pirker 
anton@ignaz.at 
@antonpirker 
Slides 
slideshare.net/apirker 
Blog post 
http://www.anton-pirker.at/django-user-permissions-in-your- 
templates/
Ad

More Related Content

What's hot (17)

Introducción a Bolt
Introducción a BoltIntroducción a Bolt
Introducción a Bolt
Asier Marqués
 
Criando aplicações com vuejs
Criando aplicações com vuejsCriando aplicações com vuejs
Criando aplicações com vuejs
Felipe César
 
JavascriptMVC
JavascriptMVCJavascriptMVC
JavascriptMVC
4lb0
 
Vuejs(1.0.26)
Vuejs(1.0.26)Vuejs(1.0.26)
Vuejs(1.0.26)
ChangJoo Park
 
programacion
programacionprogramacion
programacion
ke10neth
 
もっと使いやすくなる a-blog cms の更新方法カスタマイズ
もっと使いやすくなる a-blog cms の更新方法カスタマイズもっと使いやすくなる a-blog cms の更新方法カスタマイズ
もっと使いやすくなる a-blog cms の更新方法カスタマイズ
Kasumi Morita
 
Angularjs 개인견해
Angularjs 개인견해Angularjs 개인견해
Angularjs 개인견해
학섭 오
 
Jquerymobile ppt
Jquerymobile pptJquerymobile ppt
Jquerymobile ppt
Willy Aguirre
 
Nearby Messages API
Nearby Messages APINearby Messages API
Nearby Messages API
akkuma
 
Devise rails
Devise railsDevise rails
Devise rails
shinji14
 
jQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe JavascriptjQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe Javascript
Nando Vieira
 
23 nav
23 nav23 nav
23 nav
SatyakiDas12
 
Activity accueil
Activity accueilActivity accueil
Activity accueil
Saber LAJILI
 
Main.xml
Main.xmlMain.xml
Main.xml
Saber LAJILI
 
개발의3단계
개발의3단계개발의3단계
개발의3단계
지영 김
 
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Yuki Anzai
 
Criando aplicações com vuejs
Criando aplicações com vuejsCriando aplicações com vuejs
Criando aplicações com vuejs
Felipe César
 
JavascriptMVC
JavascriptMVCJavascriptMVC
JavascriptMVC
4lb0
 
programacion
programacionprogramacion
programacion
ke10neth
 
もっと使いやすくなる a-blog cms の更新方法カスタマイズ
もっと使いやすくなる a-blog cms の更新方法カスタマイズもっと使いやすくなる a-blog cms の更新方法カスタマイズ
もっと使いやすくなる a-blog cms の更新方法カスタマイズ
Kasumi Morita
 
Angularjs 개인견해
Angularjs 개인견해Angularjs 개인견해
Angularjs 개인견해
학섭 오
 
Nearby Messages API
Nearby Messages APINearby Messages API
Nearby Messages API
akkuma
 
Devise rails
Devise railsDevise rails
Devise rails
shinji14
 
jQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe JavascriptjQuery - Javascript para quem não sabe Javascript
jQuery - Javascript para quem não sabe Javascript
Nando Vieira
 
개발의3단계
개발의3단계개발의3단계
개발의3단계
지영 김
 
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Yuki Anzai
 

Django user permissions in your templates

  • 1. Django user permissions in your templates A nice little Django template tag pattern
  • 2. The task On the frontend display an “edit” link for the owner of an object and for super users.
  • 3. Version A {% if user.is_authenticated %} {% if user.is_superuser %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% else %} {% if my_obj.user == user %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %} {% endif %} {% endif %}
  • 4. Version A {% if user.is_authenticated %} {% if user.is_superuser %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% else %} {% if my_obj.user == user %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %} {% endif %} {% endif %}
  • 5. Version B {% if user.is_authenticated and my_obj.user == user or user.is_superuser %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %}
  • 6. Version B {% if user.is_authenticated and my_obj.user == user or user.is_superuser %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %}
  • 7. Version C {% if user|can_edit:my_obj %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %}
  • 8. Version C {% if user|can_edit:my_obj %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %} Way better!
  • 9. Version C: {% if user|can_edit:my_obj %} <a href="{% url 'my_obj:edit' my_obj.id %}"> Edit object </a> {% endif %}
  • 10. The custom template tag from django import template register = template.Library() @register.filter def can_edit(user, obj): user_can_edit = False if user.is_authenticated: if user.is_superuser: user_can_edit = True else: if obj and obj.user and obj.user == user: user_can_edit = True return user_can_edit
  • 11. More applications for this pattern {% if user|can_delete:my_object %} {% if user|is_in_group:group %} {% if event|is_attended_by:user %} {% if user|has_been_at:place %} {% if place|is_in_favorites_of:user %} {% if article|has_been_flagged_by:user %}
  • 12. Thank you for listening! Anton Pirker anton@ignaz.at @antonpirker Slides slideshare.net/apirker Blog post http://www.anton-pirker.at/django-user-permissions-in-your- templates/
  翻译: