Убедитесь, что клиент используется в приложении 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
. Вы можете узнать о его настройке здесь.