我在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)
我找不到有关如何制作此过滤器的信息。
感谢您的帮助!
答案 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
传递给您的表单。请注意,这是一个粗略的想法,没有经过测试,但你应该明白这一点。