2015-08-14 12 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