Убедитесь, что клиент используется в приложении Django

У меня проблема с реализацией пользовательского интерфейса в приложении Django.

Мой проект называется "Управление поставщиками".

Мое приложение называется "VMP".

В настройках у меня установлено значение AUTH_USER_MODEL = 'VMP.CustomUser'.

Вот моя пользовательская модель пользователя:

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User, AbstractUser
from django.utils.timezone import timedelta, now
from django.core.exceptions import ValidationError

# File validation function
def validate_file_type(value):
    allowed_types = ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"]
    if value.content_type not in allowed_types:
        raise ValidationError("Only PDF and Word documents are allowed.")

class CustomUser(AbstractUser):
    ROLE_CHOICES = [
        ('vendor', 'Vendor'),
        ('customer', 'Customer'),
        ('admin', 'Admin'),
    ]
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='customer')
    groups = models.ManyToManyField("auth.Group", related_name="custom_user_groups", blank=True)
    user_permissions = models.ManyToManyField("auth.Permission", related_name="custom_user_permissions", blank=True)

    def is_vendor(self):
        return self.role == "vendor"

    def is_customer(self):
        return self.role == "customer"

    def is_admin(self):
        return self. Role == "admin"

Вот мои взгляды:

from django.contrib.auth import get_user_model
from .models import *

# Get custom User model
CustomUser = get_user_model()

class RFPViewSet(viewsets.ModelViewSet):
    serializer_class = RFPSerializer

    def get_queryset(self):
        """Vendors see active RFPs, Customers see expired ones"""
        userid = self.request.user.id

        # Ensure user is fetched correctly as CustomUser
        user_instance = CustomUser.objects.filter(id=user.id).first()

        if user_instance.is_vendor():
            return RFP.objects.filter(is_expired=False, is_active=True)
        elif user_instance.is_customer():
            return RFP.objects.filter(customer=user_instance, is_expired=True)
        return RFP.objects.none()

Проблема 3 в том, что, хотя модель включает в себя is_customer() и is_vendor(), функции не найдены в коде набора представлений.

в нем говорится, что функции не видны. В моей IDE указано, что мой тип переменной - "AbstractUser", а не "CustomUser".

как мне это исправить? Спасибо

Я вижу две проблемы с вашим кодом, одна из которых связана с пользовательской моделью пользователя, а другая - с набором представлений.

В методе пользовательской модели пользователя is_admin вы написали:

self. Role там, где это должно быть self.role.

В наборе представлений вы определили переменную userid, но затем используете user.id, чтобы получить экземпляр CustomUser.

Вместо этого напишите это так:

class RFPViewSet(viewsets.ModelViewSet):
    serializer_class = RFPSerializer

    def get_queryset(self):
        """Vendors see active RFPs, Customers see expired ones"""
        user = self.request.user

        # No need to fetch as user is already a Custom User

        if user.is_vendor():
            return RFP.objects.filter(is_expired=False, is_active=True)
        elif user.is_customer():
            return RFP.objects.filter(customer=user_instance, is_expired=True)
        return RFP.objects.none()

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если это решит проблему.

Спасибо!

Во-первых, в вашей модели допущена опечатка:

    def is_admin(self):
        return self. Role == "admin"

Во-вторых, вы расширяете AbstractUser, что хорошо, если вы хотите немного изменить настройки по сравнению с User, используемыми в django по умолчанию. В случае дополнительной настройки лучше использовать AbstractBaseUser. AbstractBaseUser - это суперкласс AbstractUser. Вы можете узнать о его настройке здесь.

Вернуться на верх