【问题标题】:Django - limit the choices of a choice field in a formDjango - 限制表单中选择字段的选择
【发布时间】:2015-11-08 00:45:04
【问题描述】:

我在 Django 中的选择字段有问题。我需要一个表格来将订单移动添加到工作订单中。

这些是choices.py中的选择

STATUS_CHOICES = (
    (1, ("Orden Creada")),
    (2, ("En Tienda Asociada")),
    (3, ("Recibida en Cuyotek")),
    (4, ("En Mesa de Trabajo")),
    (5, ("Trabajo completado")),
    (6, ("Sin Solución")),
    (7, ("Lista para retirar en Cuyotek")),
    (8, ("Lista para retirar en Tienda Asociada")),
    (9, ("Es necesario contactar al cliente")),
    (10, ("En espera de Repuestos")),
    (20, ("ENTREGADA")),
)

如果用户不是员工,我需要将选项限制为仅显示“8 和 20”。

这是models.py中的模型

class OrderMovements(models.Model):
    fk_workorder = models.ForeignKey(WorkOrder)
    status = models.IntegerField(choices=STATUS_CHOICES, default=1)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __str__(self):
        return str(self.fk_workorder)

这是forms.py中的表单

class AddMovementForm(forms.ModelForm):

    class Meta:
        model = OrderMovements
        fields = ['status']

    def clean_status(self):
        status = self.cleaned_data.get('status')
        return status

我找不到有关如何制作此过滤器的信息。

感谢您的帮助!

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    您需要在表单类中定义一个__init__() 方法,该方法将is_staff 作为参数。 is_staff 可以是布尔值。

    def __init__(self, *args, **kwargs):
        is_staff = kwargs.pop('is_staff')
        super(AddMovementForm, self).__init__(*args, **kwargs)
        if is_staff:
            self.fields['status'].choices = STAFF_STATUS_CHOICES
        else:
            self.fields['status'].choices = STATUS_CHOICES
    

    当你初始化你的表单时,你可以这样做

    AddMovementForm(is_staff=True)  # or
    AddMovementForm(is_staff=False)
    

    【讨论】:

      【解决方案2】:

      在表单的__init__() 方法中,您可以更改status 字段的选择。

      class AddMovementForm(forms.ModelForm):
          class Meta:
              model = OrderMovements
              fields = ['status']
      
          def __init__(self, *args, **kwargs):
              self.user = kwargs.pop('user', None)
              super(AddMovementForm, self).__init__(*args, **kwargs)
              if not self.user.is_staff:
                  limited_choices = [(choice[0], choice[1]) for choice in STATUS_CHOICES if choice[0] == 8 or choice[0] == 20]
                  self.fields['status'] = forms.ChoiceField(choices=limited_choices)])
      
          def clean_status(self):
              status = self.cleaned_data.get('status')
              return status
      

      您还必须将request.user 传递给您的表单。请注意,这是一个粗略的想法,没有经过任何测试,但您应该明白这个想法。

      【讨论】:

      • 感谢您的提示,我去研究这个,因为我认为这会非常有用,但我无法让它发挥作用,呵呵。需要了解更多!
      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 2021-09-29
      • 2012-04-02
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多