数据所有者和超级用户只能使用 CBV 更新数据

Owner of the data and superuser should only be able to update the data using CBV

这是我的更新视图。因为我刚刚开始 django。我是新手

views.py

@method_decorator(login_required, name='dispatch')
class ProductUpdateView(UpdateView):
    fields = ('product_name', 'product_cost')
    model = Product
    def form_valid(self, form):
    product = get_object_or_404(Product, pk=self.object.pk)
    user = self.request.user
    if user == product.created_by or user.is_superuser:
        pass
    else:
        raise Http404()    #I tried this but it didn't work

我创建了一个超级用户和一个用户。超级用户应该能够更新他和其他人的所有产品,但用户应该只能更新他的产品。

urls.py

urlpatterns = [
    url(r'^product/(?P<pk>\d+)/update/$',
            login_required(ProductUpdateView.as_view()), name='product_update'),
]

我使用超级用户创建了一个产品,它的 pk = 1。当我用某个用户(不是超级用户)登录并访问上面的内容时 url。此用户能够更新超级用户的产品。

models.py

class Product(models.Model):
    product_name
    product_cost # This two fields and created_by
    created_by = models.ForeignKey(
    User, on_delete=models.CASCADE, related_name="Product", null=True)

是否有任何方法可以让数据所有者更新该数据,如果用户试图访问其他人的数据,则应该使用 Http404。

@method_decorator(login_required, name='dispatch')
class ProductUpdateView(UpdateView):
    fields = ('product_name', 'product_cost')
    model = Product

    def user_passes_test(self, request):
        if request.user.is_authenticated or request.user.is_superuser:
            self.object = self.get_object()
            return self.object.user == request.user
        return False

    def dispatch(self, request, *args, **kwargs):
        if not self.user_passes_test(request):
            return redirect('someview')
        return super(ProductUpdateView, self).dispatch(
            request, *args, **kwargs)

我已经创建了一个函数来检查登录用户是否是超级用户以及是否登录,然后传递对象实例来检查它是否属于该用户

尝试像 @Exprator 那样做。

def user_passes_test(self, request):
    if request.user.is_authenticated:
        self.object = self.get_object()
        return self.object.created_by == request.user
    return False

def dispatch(self, request, *args, **kwargs):
    if request.user.is_superuser:
        return super(RemitterUpdateView, self).dispatch(request, *args, **kwargs)
    elif not self.user_passes_test(request):
        return redirect("remitter_search")
    return super(RemitterUpdateView, self).dispatch(request, *args, **kwargs)