如何使用 django 在我的网站中添加类别?
Posted
技术标签:
【中文标题】如何使用 django 在我的网站中添加类别?【英文标题】:How add categories in my website with django? 【发布时间】:2021-08-05 02:32:45 【问题描述】:我是 django 的初学者,我正在尝试制作一个网站。 我想过滤网站中的类别,但在浏览器中引入 URL 时出现错误 (UnboundLocalError)。
models.py
from django.db import models
from django.contrib.auth.models import User
class Categoria(models.Model):
nombre=models.CharField(max_length=50)
created=models.DateTimeField(auto_now_add=True)
updated=models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name='categoria'
verbose_name_plural='categorias'
def __str__(self):
return self.nombre
class Post(models.Model):
titulo=models.CharField(max_length=50)
contenido=models.TextField()
imagen=models.ImageField(upload_to='blog', null=True, blank=True)
autor=models.ForeignKey(User, on_delete=models.CASCADE)
categorias=models.ManyToManyField(Categoria)
created=models.DateTimeField(auto_now_add=True)
updated=models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name='post'
verbose_name_plural='posts'
def __str__(self):
return self.titulo
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('',views.blog, name='Blog'),
path('categoria/<int:categoria_id>/', views.categoria, name='categoria'),
]
views.py
from django.shortcuts import get_object_or_404, render
from blog.models import Categoria, Post
def blog(request):
posts=Post.objects.all()
return render(request, 'blog/blog.html', 'posts':posts)
def categoria(request, categoria_id):
categoria=get_object_or_404(Categoria, id=categoria_id)
return render(request, 'blog/categorias.html', 'categoria':categoria, 'posts':posts)
blog.html
% extends 'ProyectoWebApp/base.html' %
% load static %
% block content %
% for post in posts %
<div class="intro">
<img class="intro-img img-fluid mb-3 mb-lg-0 rounded" src="post.imagen.url" style="width: 50%;">
<div class="intro-text left-0 text-center bg-faded p-5 rounded">
<h2 class="section-heading mb-4" >
<span class="section-heading-lower">post.titulo</span>
<span class="section-heading-upper">post.contenido</span>
</h2>
<div style="text-align: left; font-size: 0.8em;">
Autor: post.autor
</div>
</div>
</div>
</div>
</section>
% endfor %
<div style="width: 75%; margin: auto; text-align: center; color: white;">
Categorias:
% for post in posts %
% for categoria in post.categorias.all %
categoria.nombre
% endfor %
% endfor %
</div>
在过滤类别时,我创建了完全相同的“blog.html”副本,但我不知道如何制定循环,以便类别通过并显示而不显示错误。也许,这就是问题所在。如果有人可以帮助我,我将不胜感激。
【问题讨论】:
您忘记过滤类别为categoria
的帖子并将其分配给posts
。
(具体来说,posts = categoria.post_set.all()
)
@Jasmijn 你的解决方案很有帮助.. 非常感谢
【参考方案1】:
如果在分配局部变量之前引用了局部变量,则会引发 UnboundLocalError categoria':categoria, 'posts':posts) 更新您的方法如下:
def categoria(request, categoria_id):
categoria=get_object_or_404(Categoria, id=categoria_id)
posts=Post.objects.all()
return render(request, 'blog/categorias.html', 'categoria':categoria, 'posts':posts)
【讨论】:
【参考方案2】:在您的类别视图中:
return render(request, 'blog/categorias.html', 'categoria':categoria, 'posts':posts)
上下文'posts':posts不是来自任何地方,所以Django抛出错误UnboundLocalError,你可能想做类似的事情:
def categoria(request, categoria_id):
categoria=get_object_or_404(Categoria, id=categoria_id)
posts = Post.objects.filter(categoria__in=categoria)
return render(request, 'blog/categorias.html', 'categoria':categoria, 'posts':posts)
这样您就可以显示一个类别以及该类别的所有帖子
【讨论】:
以上是关于如何使用 django 在我的网站中添加类别?的主要内容,如果未能解决你的问题,请参考以下文章