403 Запрещенная ошибка для представления Django, несмотря на разрешения для пользовательской модели пользователя (в прилPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 403 Запрещенная ошибка для представления Django, несмотря на разрешения для пользовательской модели пользователя (в прил

Сообщение Anonymous »

Я работаю над проектом Django, в котором реализовал собственную модель пользователя (

Код: Выделить всё

CustomUser
) в приложении userauths. Пользовательская модель пользователя использует электронную почту в качестве уникального идентификатора вместо имени пользователя. Моя цель — предоставить определенным пользователям определенные разрешения (

Код: Выделить всё

change_product
или delete_product), чтобы изменить или удалить продукт. Однако даже после назначения пользователю соответствующих разрешений он по-прежнему получает ошибку 403 Forbidden.
Я следовал документации Django для создания пользовательского пользовательскую модель, но я подозреваю, что есть неправильная конфигурация или шаг, который я пропустил. Вот подробная настройка:

Пользовательская модель пользователя и менеджер (в приложении userauths):
Ниже приведен код моей пользовательской модели и ее менеджера:

Код: Выделить всё

# userauths/models.py
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import gettext_lazy as _

class CustomUserManager(BaseUserManager):
def _create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)

if not extra_fields.get('is_staff'):
raise ValueError('Superuser must have is_staff=True.')
if not extra_fields.get('is_superuser'):
raise ValueError('Superuser must have is_superuser=True.')

return self._create_user(email, password, **extra_fields)

class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = CustomUserManager()
Я заменил поле имени пользователя по умолчанию на адрес электронной почты и включил необходимые поля, такие как is_staff и is_superuser.< /p>
В моем файле settings.py у меня есть следующая строка для указания пользовательской модели пользователя:

Код: Выделить всё

AUTH_USER_MODEL = 'userauths.CustomUser'
Модель продукта (в основном приложении):
Вот модель продукта находится в основном приложении:

Код: Выделить всё

# core/models.py
from django.db import models
from shortuuidfield import ShortUUIDField
from django.utils.safestring import mark_safe
from ckeditor_uploader.fields import RichTextUploadingField
from taggit.managers import TaggableManager
from userauths.models import CustomUser  # Importing the custom user model

class Product(models.Model):
pid = ShortUUIDField(length=10, max_length=100, prefix="prd", alphabet="abcdef")
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
title = models.CharField(max_length=100, default="Apple")
image = models.ImageField(upload_to="uploads/", default="product.jpg")
description = RichTextUploadingField(null=True, blank=True, default="This is a product")
price = models.DecimalField(max_digits=10, decimal_places=2, default=1.99)
old_price = models.DecimalField(max_digits=10, decimal_places=2, default=2.99)
status = models.BooleanField(default=True)
date = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.title
Представления для редактирования и удаления продуктов:
Вот соответствующая логика представления для редактирования и удаления продукта:< /p>

Код: Выделить всё

# useradmin/views.py
from django.shortcuts import get_object_or_404, redirect, render
from django.contrib.auth.decorators import login_required, user_passes_test
from core.models import Product

@login_required
@user_passes_test(lambda user: user.is_staff)
def edit_product(request, pid):
product = get_object_or_404(Product, pid=pid)
if request.method == "POST":
form = AddProductForm(request.POST, request.FILES, instance=product)
if form.is_valid():
form.save()
return redirect("useradmin:vendordashboard")
else:
form = AddProductForm(instance=product)

context = {"form": form, "product": product}
return render(request, "useradmin/edit-product.html", context)

@login_required
@user_passes_test(lambda user:  user.is_staff)
def delete_product(request, pid):
product = get_object_or_404(Product, pid=pid)
product.delete()
return redirect("useradmin:vendordashboard")
Проблема:
  • Я назначил Change_product и разрешения delete_product пользователю через панель администратора Django.
  • Пользователь помечен как is_staff=True.
  • Несмотря на это, пользователь получает 403. Запрещенная ошибка при попытке доступа к представлениям edit_product или delete_product.
Что я пробовал:
  • Проверил, что разрешения назначены правильно с помощью:

    Код: Выделить всё

    user.get_all_permissions()
    
    В выходных данных отображаются правильные разрешения (например, core.change_product, core.delete_product).
  • Подтверждено, что используется пользовательская модель пользователя, проверив:

    Код: Выделить всё

    from django.contrib.auth import get_user_model
    print(get_user_model())
    
    Это выводит userauths.models.CustomUser.
  • Проверил is_staff code> установлено значение True.
  • Пытался заменить @user_passes_test на @permission_required:

    Код: Выделить всё

    from django.contrib.auth.decorators import permission_required
    
    @login_required
    @permission_required('core.change_product', raise_exception=True)
    def edit_product(request, pid):
    ...
    
    Это также привело к ошибке 403 Forbidden.
Ожидаемое поведение:
Если у пользователя есть соответствующее разрешение на изменение_продукта или удаление_продукта, он должен иметь возможность получить доступ к соответствующим представлениям.

Фактическое поведение:
Даже после назначения правильных разрешений представления возвращают ошибку 403 Forbidden.
< hr />
Среда:
  • Версия Django: 5.1.3
  • Версия Python: 3.12.5
  • База данных: SQLite
  • Приложения:

    Код: Выделить всё

    userauths
    для пользовательской модели
  • для модели продукта


Вопрос:
Что может быть причиной этой ошибки 403 Forbidden, даже если у пользователя есть необходимые разрешения? Нужно ли мне выполнить дополнительный шаг при использовании пользовательской модели пользователя с разрешениями?


Подробнее здесь: https://stackoverflow.com/questions/793 ... r-model-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»