Как отобразить варианты в поле Django на основе условия
У меня есть пользовательская модель пользователя:
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
is_worker = models.BooleanField(default=False)
is_customer = models.BooleanField(default=True)
def __str__(self):
return f'{self.username} - {self.is_worker}'
И у меня есть эта модель услуг :
from django.db import models
from users.models import CustomUser
SERVICE_CHOICES = (
('Carpenter', 'Carpenter'),
('Driver', 'Driver'),
('Ambulanve', 'Ambulanve'),
('Spa', 'Spa'),
('Barber', 'Barber'),
('Cleaning', 'Cleaning'),
('Cook', 'Cook'),
)
class Service(models.Model):
name = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
service = models.CharField(choices=SERVICE_CHOICES,max_length=100)
def __str__(self):
return f'{self.service} - {self.name}'
В модели сервисов я использую модель CustomUser для имени. В то время как мне нужны только те имена, где is_worker = True
. В моем коде я получаю всех пользователей независимо от статуса. Как я могу это изменить?
Вы можете использовать ForeignKey.limit_choices_to, чтобы установить предел доступных вариантов для поля foreignkey. В вашем случае :
class Service(models.Model):
name = models.ForeignKey(CustomUser, on_delete=models.CASCADE, limit_choices_to={'is_worker': True},)
service = models.CharField(choices=SERVICE_CHOICES,max_length=100)
def __str__(self):
return f'{self.service} - {self.name}'
Django doc
что-то в этом роде:
class ServiceForm(ModelForm):
def __init__(
self,
*args,
**kwargs
):
super().__init__(*args, **kwargs)
if self.instance and self.instance.is_worker:
self.fields['service'].widget = forms.Select(
choices=[(k, v)
for i in SERVICE_CHOICES if v in ('Barber', 'Spa')]
)