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:
admin links
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: