How to expose some specific fields of model
I want to create a ModelForm
which gonna show some specific field of ControlInstruction
if device_type
of Device is equals DC
. Otherwise show all fields.
Suppose, if device type == 'DC': show these filed in form-> on_off_flag, speed_flag, direction_flag else: show all
How can I do that?
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)
You may try to override form init method, like it:
class ControlInstructionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ControlInstructionForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.device and self.instance.device.device_type == 'DC':
# remove fileds for example
self.fields.pop('current_flag')
hope it help
链接地址: http://www.djcxy.com/p/38684.html上一篇: 使用标签模型创建ManytoMany关系
下一篇: 如何揭示模型的某些特定领域