Django - 限制选择字段的选择

问题描述:

我在Django的选择字段有问题。我需要一个表单来将订单动作添加到工单中。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 

我无法找到有关如何使这个过滤信息。

感谢您的帮助!

您需要在表单类中定义一个__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) 
+0

非常感谢!有用! – marcosgue

在您的表单的__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也传递给您的表单。请注意,这是一个粗略的想法,没有经过测试,但你应该明白。

+0

谢谢你的小费,我去研究这个铁道部,因为我认为将是非常有用的,但我不能使它工作嘿嘿。需要了解更多! – marcosgue