python - Django:命名 URL/相同模板,不同命名 URL

标签 python django django-templates

我有一个网络应用程序,当点击相应的链接时,它会列出我所有的艺术家、专辑和歌曲。我广泛使用通用 View (object_list/detail)和命名 url,但我遇到了一个烦恼。我有三个模板,它们几乎输出完全相同的 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 中的命名 url 链接到特定的专辑/艺术家/歌曲。但我不知道如何让它感知上下文。有什么建议吗?

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'),
)

最佳答案

您可以为通用 object_type 定义 url 模式,而不是为艺术家、专辑和歌曲单独定义:

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 标记变为

{% url music_object_list_x object_type starts_with %} *

您可能会发现您只需要一个 View ,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 %}

有关更多信息,请参阅文档(Current1.1)

关于python - Django:命名 URL/相同模板,不同命名 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660404/

相关文章:

python - Django多模板渲染

python - Django Rest Framework - 如何重组 json 响应?

django - 从 Django 模板中的 URL 访问 kwargs

python - 按重量分组

Python Selenium 陈旧元素异常

python - 带有附加参数(如果可能)或上下文处理器的通用 View 可将额外信息传递给模板?

django - PyCharm 自动导入忽略 Django 项目名称

python - 在django继承模板中添加样式标签

python - 我无法将 ML 模型加载到尝试使用 joblib 和 pickle 的 flask 中

python - Homebrew 升级后的 Jupyter Notebook ModuleError