Django не дает пользователям редактировать свои записи в админке - PullRequest
0 голосов
/ 18 мая 2019

В Django у меня есть модель под названием Loans.Я хочу, чтобы пользователи могли редактировать кредит, созданный кем-то другим, но не в том случае, если они сами его создали.

В качестве бонуса я бы хотел, чтобы сотрудники не могли редактировать кредиты, принадлежащие другому персоналу..

Как я могу это сделать?Я действительно понятия не имею,.Я попытался создать пользовательскую проверку, а затем попробовал менеджер, подобный этому:

from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
from core.models import User


class LoanManager(models.Manager):
    def create_loan(self, request, borrower, approved, start_date, term_in_months, principal, interest_rate_pa, **extra_fields):
        """Creates and saves a new loan"""
        print('USER========================================', request.user)

        if borrower != request.user:
            raise ValueError("Staff may not lend to themselves or other staff")

        return super(LoanManager, self).create(borrower=borrower, approved=approved, start_date=start_date, term_in_months=term_in_months, principal=principal, interest_rate_pa=interest_rate_pa,**extra_fields)


class Loans(models.Model):
    borrower = models.ForeignKey(User, on_delete=models.CASCADE)
    approved = models.BooleanField(default=False)
    start_date = models.DateField(auto_now_add=True)
    term_in_months = models.IntegerField(validators=[
            MaxValueValidator(360),
            MinValueValidator(24)
        ])
    principal = models.IntegerField(validators=[
            MaxValueValidator(1000000),
            MinValueValidator(2000)
        ])
    interest_rate_pa = models.DecimalField(max_digits=5, decimal_places=2)

    objects = LoanManager()

Ничто из того, что я делаю, не мешает пользователям создавать кредиты для себя и редактировать их!

1 Ответ

0 голосов
/ 18 мая 2019

Используйте миксин с видом.В приведенном ниже примере следует проверить, является ли текущий пользователь заемщиком объекта Loan.Если они одинаковые, это предотвращает доступ.

class MyLoanMixin (object):
    permission_denied_message = "You may not modify your own loan"

    def dispatch (self, request, *args, **kwargs):
        if self.get_object().borrower == request.user:
            raise PermissionDenied(self.get_permission_denied_message())
        return super().dispatch(request, *args, **kwargs)

    def get_permission_denied_message(self):
        """
        Override this method to override the permission_denied_message attribute.
        """
        return self.permission_denied_message

    def handle_no_permission(self):
        if self.raise_exception:
            raise PermissionDenied(self.get_permission_denied_message())
        return redirect_to_login(self.request.get_full_path(), self.get_login_url(), self.get_redirect_field_name())
...