如何根据条件在 Django 字段中呈现选择

How to render choices in a Django field based on a condition

我有一个自定义用户模型:

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 来设置外键字段可用选项的限制。在你的情况下:

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')]
            )