【问题标题】:Owner of the data and superuser should only be able to update the data using CBV数据所有者和超级用户应该只能使用 CBV 更新数据
【发布时间】:2018-07-27 02:49:45
【问题描述】:

这是我的更新视图。因为我刚刚开始使用 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。当我使用某个用户(不是超级用户)登录并访问上述网址时。此用户能够更新超级用户的产品。

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。

【问题讨论】:

    标签: django django-forms django-class-based-views


    【解决方案1】:
    @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)
    

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

    【讨论】:

    • 从 is_superuser 中删除 () 并检查一次
    • 如果用户是超级管理员则不会,请检查数据库以确保您登录的用户的is_superuser列为1\
    • 如果你使用的是 django 1.10 + 然后从 is_authenticated 中删除 () 也
    【解决方案2】:

    尝试像 @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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多