Django 1.8使用多个DetailView
Django 1.8使用多个DetailView
我一直在尝试在我的views.py中使用多个DetailView,但由于某种原因,在模板渲染期间出现了这个错误。[链接1] [链接2]。我的views.py如下:
def rock_and_feat(request): feats = Feat.objects.order_by('-created')[:3] rocks = Rockinfo.objects.order_by('-rank')[:50] context = RequestContext(request, { 'feats': feats, 'rocks': rocks }) return render_to_response('template.html', context) class DetailView(generic.DetailView): model = Feat template_name = 'feature/detail.html' context_object_name = 'feat' class RockDetailView(generic.DetailView): model = Rockinfo template_name = 'feature/detailrock.html' context_object_name = 'rockinfo'
我的apps的urls.py如下:
urlpatterns = [ url(r'^$', views.rock_and_feat, name='rock_and_feat'), url(r'^(?P[0-9]+)/$', views.DetailView.as_view(), name='detail'), url(r'^(?P [0-9]+)/$', views.RockDetailView.as_view(), name='detailrock'), ]
我的项目的urls.py如下:
urlpatterns = [ url(r'^', include('feature.urls', namespace="feature")), url(r'^admin/', include(admin.site.urls)), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
template.html如下:
{% block rocker %} {% if rocks %} {% for item in rocks %}{{ item.rock_name }} {% endfor %} {% else %} No rockers are available. {% endif %} {% endblock %}
我无法弄清楚错误是什么。谢谢。
问题原因:在模板中使用了`{% url 'feature:detailrock' rockinfo.id %}`的方式来生成URL链接,但是在URL配置中使用了命名空间`feature`。
解决方法:可以尝试以下两种方法中的任意一种:
1. 检查模板中获取`rockinfo.id`的部分,并且检查URL配置中的命名空间是否正确。可以使用如下代码生成URL链接:<a href="{% url 'feature:detailrock' rockinfo.id %}">
2. 从URL配置中移除命名空间,并且在模板中直接使用如下代码生成URL链接:<a href="{% url 'detailrock' rockinfo.id %}">
。
我认为以上两种方法中的任意一种都可以解决问题。
Django 1.8 使用多个DetailView的问题出现的原因是在URL配置中使用了错误的名称,并且在模板中使用了错误的变量名。解决方法是将URL配置中的名称更正,并在模板中使用正确的变量名。
问题首先出现在URL配置中的以下代码中:
urlpatterns = [ url(r'^$', views.rock_and_feat, name='rock_and_feat'), url(r'^detail/(?P[0-9]+)/$', views.DetailView.as_view(), name='detail'), url(r'^rock_detail/(?P [0-9]+)/$', views.RockDetailView.as_view(), name='detailrock'), ]
在这段代码中,URL配置中定义了两个DetailView视图的名称,分别是'detail'和'detailrock'。然而,在模板中使用了错误的名称'feature:detailrock',导致链接生成错误。解决方法是将模板中的链接改为使用正确的名称'feature:detail':
{% url 'feature:detail' item.pk %}
另外,需要注意的是,'id'和'pk'在Django中并不是同一个概念。'pk'是记录的主键,而'id'是记录在数据库中的唯一标识符。因此,在模板中生成链接时,应该使用'pk'而不是'id'。可以参考以下链接了解更多信息:[Django Queries: id vs pk](https://stackoverflow.com/questions/2165865)。
此外,在模板中还存在一个可以改进的地方。可以将以下代码:
{% if rocks %} {% for item in rocks %} .... {% endfor %} {% else %}No rockers are available.
{% endif %}
替换为以下代码:
{% for item in rocks %} ... {% empty %}No rockers are available.
{% endfor %}
使用这种方式可以更简洁地处理列表为空的情况。可以参考Django文档中的相关内容:[for...empty](https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for-empty)。