【问题标题】:UnboundLocalError at /Tag/HTC-Phones/ local variable 'tag' referenced before assignment - DjangoUnboundLocalError at /Tag/HTC-Phones/ 分配前引用的局部变量'tag' - Django
【发布时间】:2020-11-01 17:49:56
【问题描述】:

我收到以下错误:

UnboundLocalError at /Tag/HTC-Phones/
local variable 'tag' referenced before assignment
/home/pc/Desktop/django_stuff/blog_project/blog_app/views.py in tag_detail, line 86

models.py:

class Tag(models.Model):
    Tag_Name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True,editable=True,max_length=200)

    def __str__(self):
        return self.Tag_Name

    def get_absolute_url(self):
        return reverse('tag_detail_url', kwargs={'slug':self.slug})

class Mobile(models.Model):
    name = models.CharField(max_length=100,default="")
    post_date = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    tag = models.ManyToManyField('Tag',blank=True,related_name='posts')

views.py:

from .models import Tag

def tag_detail(request,slug):
    tag = Tag.objects.filter(manytomanyfield=tag)
    return render(request,'website_primary_html_pages/tag_detail.html',context={'tag':tag})

tag = Tag.objects.filter(manytomanyfield=tag) 中的视图错误

如何解决这个问题,谢谢

【问题讨论】:

  • 那么您要渲染Mobiles 还是Tag
  • 标签和手机我用过manytomanyfield,所以我想添加标签并同时使用Mobile model中的数据
  • 是的,但是 slug 通常只会匹配一个标签,因为这是 Tag 的“详细视图”。所以我猜那么有 one 标签,还有一些Mobiles?

标签: django django-models django-views


【解决方案1】:

您可以通过以下方式获取给定标签的相关Mobiles:

from django.shortcuts import get_object_or_404, render
from .models import Tag, Mobile

def tag_detail(request,slug):
    tag = get_object_or_404(Tag, slug__iexact=slug)
    mobiles = Mobile.objects.filter(tag=tag)
    context = {
        'tag': tag,
        'mobiles': mobiles
    }
    return render(request, 'website_primary_html_pages/tag_detail.html', context)

在模板中你用:

{% for mobile in mobiles %}
    <!-- render the mobile -->
    {{ mobile.name }}
{% endfor %}

你也可以paginate [Django-doc] mobiles 对象:

from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404, render
from .models import Tag, Mobile

def tag_detail(request,slug):
    tag = get_object_or_404(Tag, slug__iexact=slug)
    mobiles = Mobile.objects.filter(tag=tag)
    paginator = Paginator(mobiles, 25)  # &leftarrow; 25 objects per page
    page_obj = paginator.get_page(request.GET.get('page'))
    context = {
        'tag': tag,
        'mobiles': mobiles,
        'page_obj': page_obj
    }
    return render(request, 'website_primary_html_pages/tag_detail.html', context)

然后你遍历page_obj:

{% for mobile in page_obj %}
    <!-- render the mobile -->
    {{ mobile.name }}
{% endfor %}

Paginating a ListView [Django-doc] 部分包含有关如何呈现指向上一页/下一页的链接的信息。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
  • 2017-09-19
  • 2020-09-26
  • 2022-01-02
相关资源
最近更新 更多