python - django URLs MultipleObjectsReturned 错误
问题描述
我正在用 Django 制作一个简单的 webapp。用户可以拥有个人资料,并在该个人资料下创建博客文章。
例如:
"path('profile/<int:pk>/',profile, name='profile')"
返回网址
"http://127.0.0.1:8000/profile/1/"
然后,用户可以编写在 URL 中具有名称的博客文章
例子:
path('profile/<int:pk>/blog/<str:name>',Blogs, name='Blogs'),
返回网址
"http://127.0.0.1:8000/profile/1/blog/HelloWOrld"
但是,如果两个不同的用户都将他们的博客命名为相同的确切名称,我会收到“MultipleObjectsReturned”错误。
我认为通过在 URL 中更早地让用户 PK 可以确保它是唯一的,即使两个博客被称为完全相同的东西。
视图.py
def Blog(request, pk, name):
blog = Restaurant.objects.get(name=name)
user = CustomUser.objects.get(pk=pk)
if not user.id == request.user.pk:
raise PermissionDenied()
else:
context = {
'user': user,
'blog': blog,
}
return render(request, 'blog/blogs.html',context)
有没有办法在不使用博客的 PK 的情况下解决这个问题?如果有人能解释为什么我的逻辑是错误的,而且它一开始就不起作用。
谢谢。
解决方案
您需要确保获得该用户的该名称的博客。我不知道你的博客模型看起来如何,但它会是这样的
user = CustomUser.objects.get(pk=pk)
blog = Restaurant.objects.get(name=name, user=user)
并且在模型上,使用 'unique_together' 属性来确保用户和博客名称的组合是唯一的,否则这些 URL 将不起作用。没有必要像 George 的回答那样拥有完全唯一的名称,这意味着用户无法创建具有其他用户已经制作的标题的博客文章。
推荐阅读
- javascript - 在 Fluid foreach 中填充 Javascript 数组
- java - javax.jmdns lib 没有被导入。如何清除错误?
- c# - 在 RabbitMQ 中创建一个新的 IModel 实例的成本是多少
- angular - 环境变量的 angular2 元数据
- php - 如何在不知道表的主键和外键的情况下加入多个 mysql 表
- node.js - 文件未显示 express js
- android - 适用于 Android 的 Base64 检查器
- docker - 无法在容器中运行 helm 命令
- python-3.x - 尝试解密消息但出现TypeError:无法将字节连接到str
- javascript - 在 Java 中作为环境变量列出