【问题标题】:How can I Properly use Django Class Based View UserPassesTestMixin in UpdateView如何在 UpdateView 中正确使用基于 Django 类的视图 UserPassesTestMixin
【发布时间】:2022-07-02 21:52:19
【问题描述】:

我正在开发一个 Django 项目,用户将拥有一个银行记录。而且我不希望他们能够更新别人的银行记录,除了他们自己的。 我想使用 Django UserPassesTestMixin 来执行此限制,但每次尝试访问 UpdateView 时都会收到 403 Forbidden 错误。

这是我的模型代码:

class BankDetails(models.Model):
    applicant = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    bank = models.CharField(max_length=30, choices=BANK, blank=True, null=True)
    account = models.CharField(max_length=20, blank=True, default=None, null = True)
    name = models.CharField(max_length=60, blank=True, null=True)
    branch = models.CharField(max_length=60, blank=True, null = True)
    date = models.DateTimeField(auto_now_add=True)

这是基于类的视图代码:

from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin, UserPassesTestMixin

class UpdateBank(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    template_name = 'user/edit_bank.html'
    model = BankDetails
    form_class = ApplicantBankForm


    def get_success_url(self):
        return reverse_lazy('bank-detail',kwargs={'pk': self.get_object().id})

    def test_func(self):
        return self.get_object().applicant_id == self.request.user.pk 


class BankDetailView(LoginRequiredMixin, DetailView):
    template_name = 'user/bank_detail.html'
    model = BankDetails

    def get_success_url(self):
        return reverse_lazy('app-submit', kwargs = {'pk' : self.get_object().id})

我的 urls.py 代码:

path('<int:pk>/update/', UpdateBank.as_view(), name = 'edit-bank'),

【问题讨论】:

    标签: python django


    【解决方案1】:

    您需要根据这里的答案实现 handle_no_permission:

    Django - How to redirect differently using LoginRequired and PermissionRequired?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2015-12-04
    • 2011-08-19
    • 2021-02-07
    • 2023-04-08
    • 2019-08-29
    • 2021-06-26
    相关资源
    最近更新 更多