Как отобразить варианты в поле 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')]
            )

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