django - Django 限制用户编辑不属于他们的数据
问题描述
我有网址,
path('faculty/edit/<str:pk>/', faculty.edit_form, name="faculty-edit"),
path('faculty/delete/<str:pk>', faculty.delete, name="faculty-delete"),
localhost:8000/user/faculty/edit/1
在上面, 1 是属于 user=x 的数据的 id !同样,我有 1000 条数据
现在,当我以 user=y 身份登录并转到相同的链接时,它会打开编辑页面!但是数据 1 属于 user=x - 如何处理?如何限制这个?
django 是自动执行此操作还是我们需要手动执行此操作?
我的编辑视图:
def edit_form(request, pk):
faculty = Faculty.objects.get(id=pk)
form = AddFacultyForm(instance=faculty)
if request.method == 'POST':
form = AddFacultyForm(request.POST, instance=faculty)
if form.is_valid():
form.save()
return redirect('faculty')
context = {'form':form}
return render(request, 'faculty/edit_form.html', context)
现在添加模型,
#Faculty
from django.db import models
from .profile import University
class Faculty(models.Model):
owner = models.ForeignKey(University, on_delete=models.CASCADE)
faculty_name = models.CharField(max_length=128, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
#Univ Profile
from django.db import models
from django.contrib.postgres.fields import ArrayField
from unireo.users.models import User
class University(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
解决方案
在视图中,我们可以过滤Faculty
对象,以便Faculty
有一个Profile
链接到登录用户的对象:
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
@login_required
def edit_form(request, pk):
faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
# …
如果请求是由与Faculty
对象不相关的用户发出的,这将返回 HTTP 404 答案。
如果主键是数字序列,而不是任何字符串,我还建议主键是否为数字,以便与<int:…>
路径转换器 [Django-doc]一起使用以仅“触发”视图:
path('faculty/edit/<int:pk>/', faculty.edit_form, name='faculty-edit'),
path('faculty/delete/<int:pk>/', faculty.delete, name='faculty-delete'),
您可以改为返回重定向:
from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect
@login_required
def edit_form(request, pk):
try:
faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
except Http404:
return redirect('%%%name-of-some-view%%%')
# …
注意:您可以使用
@login_required
装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图 。
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型比直接使用User
模型 [Django-doc]更好。有关更多信息,您可以查看文档的引用User
模型部分。
推荐阅读
- css - 如何将多个类合并为一个?
- python - 在 Pandas/Python 中创建一个只有年份的日期范围
- redis - Redis 想要使用未知 IP 地址进行复制
- azure-sql-data-warehouse - 具有 1 个计算节点的 SQL 数据仓库 (Azure Synapse) 中小维度的复制表分布
- c# - ASP.NET Core 环境变量在更改时重新加载配置
- python - Django Project 1 实施问题
- flutter - 使用 HAPI FHIR 发布资源包
- php - 如何将工作查询转换为 Eloquent Lumen 配置
- c++ - C++ 使用局部变量保留左值和右值
- python - 如何读取单个反斜杠?