2015-08-14 116 views
3

我在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 

我無法找到有關如何使這個過濾信息。

感謝您的幫助!

回答

7

您需要在表單類中定義一個__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

0

在您的表單的__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