首页 > 解决方案 > 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)

标签: django

解决方案


在视图中,我们可以过滤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:…&gt;路径转换器 [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模型部分


推荐阅读