【问题标题】:How to render choices in a Django field based on a condition如何根据条件在 Django 字段中呈现选择
【发布时间】:2021-12-19 09:08:26
【问题描述】:

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

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 的适当数据库表。”
  • @KlausD。能详细解释一下吗?
  • 阅读choices上的文档!

标签: python python-3.x django django-models


【解决方案1】:

您可以使用 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}'

姜戈doc

【讨论】:

    【解决方案2】:

    类似的东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-23
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2015-02-02
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多