【问题标题】:TypeError object is not iterable in DjangoTypeError 对象在 Django 中不可迭代
【发布时间】:2021-08-02 11:45:54
【问题描述】:

我正在使用 Django 创建一个电影网站。我在其中创建了一个流派模型并将其显示在模板中。现在我希望这些每个类型的对象都重定向到其他页面。例如,我创建了 45 种流派类型并显示在模板中。现在我要做的是,在模板中单击流派动作时将用户重定向到例如动作流派列表。为此,我在模板中使用了 for 循环,但是当单击它抛出的任何类型对象时 /home/genre/5/ 处的类型错误 “流派”对象不可迭代。这里有什么问题?任何建议都会很棒。

我的 urls.py:

urlapatterns = [path('', views.home, name='home'), path('genre/<int:pk>, views.genreView, name='home')]

views.py:

def genreView(request, pk):
genres = get_object_or_404(Genre, id=pk)
context = {
    'genres': genres
}

return render(request, 'genre.html', context)

def home(request):
genres = Genre.objects.all()
context = {
    'genres': genres
}

return render(request, 'index.html', context)

home.html:

{% for genre in genres %}
  <a href="{% url 'genre' genre.id %}" class="text-yellow-400 hover:text-white p-2 text-xs">{{genre.title}}</a>     
{% endfor %}

models.py:

 class Genre(models.Model):
    title = models.CharField(max_length=500)

def __str__(self):
    return self.title

【问题讨论】:

    标签: python-3.x django django-models django-views


    【解决方案1】:

    在您看来,genres 不是GenresQuerySet(集合),而是单个Genre 对象,因此您应该简单地渲染该类型的细节:

    def genreView(request, pk):
        genre = get_object_or_404(Genre, id=pk)
        context = {
            'genre': genre
        }
        return render(request, 'genre.html', context)

    在您的genre.html 中,您应该 迭代genre,而是像这样呈现:

    <!-- genre.html -->
    <!-- do not iterate over genre -->
    
    {{ genre.title }}
    <!-- … -->

    【讨论】:

    • 渲染流派对象很好,但是当我想重定向到特定流派之一的详细信息页面时出现问题......渲染工作正常。例如,当我想使用动态 url 重定向到动作流派页面时,它说“流派”对象不可迭代。如果我要为每种类型创建一个页面,我将不得不创建 50 多个页面。为了避免这种情况,我使用了我的情况所必需的 for 循环
    • @AmitBuyo:您的视图的name=... 在您的urls.py 中是'home',所以要引用它,您需要{% url 'home' genre.pk %}
    猜你喜欢
    • 2020-02-28
    • 2019-07-25
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2020-10-14
    • 2021-06-19
    • 2017-08-27
    相关资源
    最近更新 更多