Django - 限制表单中选择字段的选择 [英] Django - limit the choices of a choice field in a form

查看:236
本文介绍了Django - 限制表单中选择字段的选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



这些是options.py中的选项。

  STATUS_CHOICES =(
(1,(Orden Creada)),
(2,(En Tienda Asociada)),
(3,(Recibida en Cuyotek)),
(4,(En Mesa de Trabajo)),
(5,(Trabajo completado)),
(6 ,(SinSolución)),
(7,(Lista para retirar en Cuyotek)),
(8,(Lista para retirar en Tienda Asociada)),
(10,(En espera de Repuestos)),
(20,(ENTREGADA)),

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



这是models.py中的模型

  class OrderMovements (models.Model):
fk_workorder = models.ForeignKey(WorkOrder)
status = models.IntegerField(options = STATUS_CHOICES,default = 1)
timestamp = model s.DateTimeField(auto_now_add = True,auto_now = False)
$ b $ def __str __(self):
return str(self.fk_workorder)
pre>

并且这个form.py中的表单

  class AddMovementForm (forms.ModelForm):

class Meta:
model = OrderMovements
fields = ['status']
$ b $ def clean_status(self):
status = self.cleaned_data.get('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)#或
AddMovementForm(is_staff = False)


I'm having a problem with a choice field in Django. I need to have a form to add order movements to a work orders.

These are the choices in 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")),
)

And I need to limit the choices to show only "8 and 20" if the user is not staff.

This is the model in 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)

And this the form in forms.py

class AddMovementForm(forms.ModelForm):

    class Meta:
        model = OrderMovements
        fields = ['status']

    def clean_status(self):
        status = self.cleaned_data.get('status')
        return status

I can't find info about how to make this filter.

Thanks for your help!

解决方案

You need to define an __init__() method in your form class which takes is_staff as an argument. is_staff can be a boolean value.

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

When you initialize your form, you can do

AddMovementForm(is_staff=True)  # or
AddMovementForm(is_staff=False)

这篇关于Django - 限制表单中选择字段的选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆