如何根据条件在 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')]
)
我有一个自定义用户模型:
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')]
)