如何根据model_a字段公开model_b的某些特定字段?

时间:2017-08-14 09:02:51

标签: python django

我想创建一个ModelForm,如果设备的ControlInstruction等于device_type,则会显示DC的某个特定字段。否则显示所有字段。

Suppose, 
if device type == 'DC':
   show these filed in form-> on_off_flag, speed_flag, direction_flag
else:
   show all

我该怎么做?


    class Device(models.Model):
        DEVICE_TYPES = (
            ('AC', 'AC MOTOR'),
            ('DC', 'DC MOTOR'),
        )
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        device_id = models.CharField(max_length=64, unique=True, blank=False)
        device_name = models.CharField(max_length=100, blank=False)
        device_model = models.CharField(max_length=10)
        device_type = models.CharField(max_length=2, choices=DEVICE_TYPES, blank=False)
        location = models.CharField(max_length=150)

        def __str__(self):
            return self.device_name

    class ControlInstruction(models.Model):
        DIRECTION_CHOICES = (
            ('FW', 'Forward'),
            ('BW', 'Backward'),
        )
        # OneToOneField is is similar to a ForeignKey with unique=True, but the “reverse”
        # side of the relation will directly return a single object.
        device = models.OneToOneField(Device, on_delete=models.CASCADE, primary_key=True)
        on_off_flag = models.BooleanField(default=False)
        voltage_flag = models.FloatField(max_length=20, default=0)
        current_flag = models.FloatField(max_length=20, default=0)
        speed_flag = models.IntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(100)])
        direction_flag = models.CharField(max_length=2, choices=DIRECTION_CHOICES, default='FW')
        frequency_flag = models.IntegerField(default=0)

2 个答案:

答案 0 :(得分:0)

我建议创建两种形式,一种形式仅包含DC设备的字段,另一种形式包含所有字段。然后,在您的视图中,根据device_type选择要使用的表单。

答案 1 :(得分:0)

class DeviceForm(forms.ModelForm):
     class Meta:
         model = Device
         fields = "__all__"

     def __init__(self,*args,**kwargs):
         super().__init__(*args, **kwargs)
         if self.instance.pk:
              if self.instance.device_type != "DC":
                   del self.fields["on_off_flag"]
                   del self.fields["speed_flag"]
                   del self.fields["direction_flag"]

但是我不建议这样做,因为您会发现这种方法非常有限

相关问题