我有一个webapp,列出了点击相应链接后的所有艺术家,专辑和歌曲。我广泛使用通用视图(object_list / detail)和命名网址,但我遇到了烦恼。我有三个模板,几乎输出完全相同的html,看起来像这样:
{% extends "base.html" %}
{% block content %}
<div id="content">
<ul id="starts-with">
{% for starts_with in starts_with_list %}
<li><a href="{% url song_list_x starts_with %}">{{ starts_with|upper }}</a></li>
{% endfor %}
</ul>
<ul>
{% for song in songs_list %}
<li>{{ song.title }}</li>
{% endfor %}
</ul>
</div>
{% endblock content %}
我的艺术家和专辑模板看起来几乎相同,我想将三个模板合并为一个。我的变量以song
开头的事实可以轻松更改为默认obj
。这是我的<ul id="starts-with">
名为url我不知道如何纠正。显然我希望它使用我urls.py
中的命名网址链接到特定的专辑/艺术家/歌曲,但我不知道如何使其具有上下文感知能力。有什么建议吗?
urls.py:
urlpatterns = patterns('tlkmusic.apps.tlkmusic_base.views',
# (r'^$', index),
url(r'^artists/$', artist_list, name='artist_list'),
url(r'^artists/(?P<starts_with>\w)/$', artist_list, name='artist_list_x'),
url(r'^artist/(?P<artist_id>\d+)/$', artist_detail, name='artist_detail'),
url(r'^albums/$', album_list, name='album_list'),
url(r'^albums/(?P<starts_with>\w)/$', album_list, name='album_list_x'),
url(r'^album/(?P<album_id>\w)/$', album_detail, name='album_detail'),
url(r'^songs/$', song_list, name='song_list'),
url(r'^songs/(?P<starts_with>\w)/$', song_list, name='song_list_x'),
url(r'^song/(?P<song_id>\w)/$', song_detail, name='song_detail'),
)
答案 0 :(得分:3)
您可以为通用object_type定义网址格式,而不是为艺术家,专辑和歌曲单独定义:
urlpatterns = patterns('tlkmusic.apps.tlkmusic_base.views',
# (r'^$', index),
url(r'^(?P<object_type>\w+)/$', music_object_list, name='music_object_list'),
url(r'^(?P<object_type>\w+)/(?P<starts_with>\w)/$', music_object_list, name='music_object_list_x'),
url(r'^(?P<object_type>\w+)/(?P<object_id>\d+)/$', music_object_detail, name='music_object_detail'),
)
然后在您的模板中,您的网址标记变为
{% url music_object_list_x object_type starts_with %} *
您可能会发现只需要一个视图music_object_list
。如果您发现每个对象类型需要不同的函数,请调用music_object_list
中的各个函数。
def music_object_list(request, object_type, starts_with=None):
if object_type == 'artists':
return artist_list(request, starts_with=starts_with)
elif object_type == 'albums':
return album_list(request, starts_with=starts_with)
...
如果您使用的是django.views.generic.list_detail.object_list
,请记得将object_type
添加到extra_context
字典中。这会将object_type添加到模板上下文中,从而允许url标记起作用。
extra_context = {'object_type': 'songs', ...}
*这是Django 1.2的新url标记语法。对于旧版本,您可以使用逗号。
{% url music_object_list_x object_type,starts_with %}