Django - 限制表单中选择字段的选择

时间:2015-08-14 17:19:15

标签: python django forms

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

这些是choices.py

中的选项
from matplotlib.path import Path

x = [0,2,3,4,5]
y = [1,4,5,6,7]
z = [4,5,6,7,8]
PC = plt.fill_between(x, y, z)
PC._paths = [Path(np.vstack([[1,1,2,3,4,5,5,5,4,3,2,1,1],
                             [4,3,4,5,6,7,8,8,7,6,5,4,4]]).T,
                   np.array([1,2,2,2,2,2,2,2,2,2,2,2,9]))]

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

这是models.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")),
)

这是form.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)

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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传递给您的表单。请注意,这是一个粗略的想法,没有经过测试,但你应该明白这一点。