Django i uniwersalne linki do edycji obiektu
21 lutego, 2011
Napisałem sobie tag wyświetlający mały boks wyświetlany na każdej podstronie, gdzie user może edytować wyświetlany obiekt. Chodzi o coś takiego:

Tag, wywołany na stronie np. object_detail, wyświetla w wybranym miejscu linki do edycji i usunięcia wyświetlanego obiektu, utworzenia nowego obiektu tego typu lub widoku listy w Panelu Admina Django. Linki są wyświetlane zależnie od uprawnień. Jeśli jako argument podamy obiekt QuerySet, wyświetlone zostaną linki do utworzenia nowego obiektu typu zawartego w QuerySet oraz Listy aktualnych obiektów w Panelu Admina.
Składnia tagu:
{% admin_links object %}Jako object podajemy instancję Modelu lub obiekt QuerySet.
Zatem, do dzieła! Najpierw plik w templatetags:
# admin_tags.py from django import template from django.core.urlresolvers import reverse from django.db.models.query import QuerySet register = template.Library() @register.inclusion_tag('_admin_links.html', takes_context=True) def admin_links(context, obj): if type(obj) == QuerySet: model = obj.model delete_url = change_url = None else: model = obj app_label = model._meta.app_label model_name = model._meta.module_name url_parts = (app_label,model_name) user = context.get('user') if not type(obj) == QuerySet: if user.has_perm("%s.can_change"% model_name): change_url = reverse("admin:%s_%s_change" % url_parts , args=(model.id,)) else: change_url = None if user.has_perm("%s.can_delete"% model_name): delete_url = reverse("admin:%s_%s_delete" % url_parts , args=(model.id,)) else: delete_url = None if user.has_perm("%s.can_add"% model_name): add_url = reverse("admin:%s_%s_add" % url_parts ) else: add_url = None list_url = reverse("admin:%s_%s_changelist" % url_parts ) return { 'user': user, 'MEDIA_URL': context.get('MEDIA_URL'), 'verbose_name': model._meta.verbose_name, 'delete_url': delete_url, 'change_url': change_url, 'add_url': add_url, 'list_url': list_url, }
Poniższy kod wrzucamy do pliku templates/_admin_links.html:
{% if user.is_staff %}
<div class="admin-links">
{{ verbose_name }}:
<ul>
{% if change_url %}<li><a title="edytuj: {{verbose_name}}" href="{{change_url}}"><img alt="[edytuj]" src="{{MEDIA_URL}}images/page_white_edit.png" > edytuj</a></li>{% endif %}
{% if delete_url %}<li><a title="usuń: {{verbose_name}}" href="{{delete_url}}"><img alt="[usuń]" src="{{MEDIA_URL}}images/page_white_delete.png" > usuń</a></li>{% endif %}
{% if add_url %}<li><a title="dodaj nowy: {{verbose_name}}" href="{{add_url}}"><img alt="[dodaj]" src="{{MEDIA_URL}}images/page_white_add.png" > dodaj</a></li>{% endif %}
{% if list_url %}<li><a title="lista: {{verbose_name}}" href="{{list_url}}"><img alt="[lista]" src="{{MEDIA_URL}}images/page_white_stack.png" > lista</a></li>{% endif %}
</ul>
</div>
{% endif %}
i dorzucamy jakiś styl. Przykład poniżej:
#content{ position: relative; } #content .admin-links{ background: none repeat scroll 0 0 #FAFAFA; border: 1px solid #DDDDDD; display: none; font-size: 12px; font-weight: bold; list-style: none inside none; margin: 0; padding: 3px; position: absolute; right: 0; top: 0; -moz-box-shadow: 1px 2px 2px #777; -webkit-box-shadow: 1px 2px 2px #777; box-shadow: 1px 2px 2px #777; padding-left:8px; opacity:0.7; color: #666; } #content:hover .admin-links{ display: block } #content .admin-links:hover{ opacity:1; } #content:hover .admin-links ul{ display: inline; } #content .admin-links li{ display: inline; margin: 0; padding: 0; } #content .admin-links li a{ border: 1px solid #fff; background: #fff; padding: 3px 5px; } #content .admin-links li a:hover{ border-color: #bcd; background: #cde; } #content .admin-links li img{ position: relative; top: 3px; }
Uwagi mile widziane ;)
Komentarze do wpisu "Django i uniwersalne linki do edycji obiektu":
1.
matiit napisał(a):
21 lutego 2011, 16:59:59
wreszcie coś o django na joggerze, szkoda że takiego czegoś nie da się instalować tak prosto jak w rails, wpis w Gemfile i bundle (albo nie wiem, ze tak sie da)
2.
chester napisał(a):
21 lutego 2011, 22:52:05
Da się instalować, można przecież stworzyć aplikację z tego, ale moim zdaniem to za dużo zachodu na 2 pliki, w porywach 3 ;)
PS. Ja też ciągle czekam, aż w końcu coś ciekawego pojawi się na joggerze, bo długi czas już cisza była.
Dodaj komentarz: