Django 1.8使用多个DetailView

32 浏览
0 Comments

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 %}
              Dimitri Vegas & Like Mike
               {{ item.rock_name }}
           {% endfor %}
       {% else %}
               No rockers are available.
       {% endif %}
   {% endblock %}

我无法弄清楚错误是什么。谢谢。

0
0 Comments

问题原因:在模板中使用了`{% 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 %}">

我认为以上两种方法中的任意一种都可以解决问题。

0
0 Comments

这个问题的出现原因是rockinfo.id为空或者不存在,或者没有传递给模板。另外,你应该为这两个视图设置两个不同的路径模式。希望这能帮到你。

解决方法如下:

修改模板中的rockinfo.id,确保其有值且存在。

为这两个视图设置不同的路径模式。

0
0 Comments

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)。

0