繁体   English   中英

如何根据条件在 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 文档

类似的东西:


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM