我正在创建一个应用程序,用户可以在其中设置对象和要记录的相应数据。让我举个例子:
class vehicle_type(models.Model):
name = models.CharField(max_length=20, unique=True)
int1_name = models.CharField(max_length=20, blank=True, null=True)
int1_default = models.IntegerField(blank=True, null=True)
int2_name = models.CharField(max_length=20, blank=True, null=True)
int2_default = models.IntegerField(blank=True, null=True)
float1_name = models.CharField(max_length=20, blank=True, null=True)
float1_default = models.FloatField(blank=True, null=True)
class vehicle(models.Model):
registration = models.CharField(max_length=20)
vehicle_type = models.ForeignKey(vehicle_type)
int1_val = models.IntegerField(blank=True, null=True)
int2_val = models.IntegerField(blank=True, null=True)
float1_val = models.FloatField(blank=True, null=True)
数据将用于描述车辆:
# pseudo code
vehicle_type('Car','Seats',4,'Doors',4,'',)
vehicle_type('Van','Seats',2,'',,'Load',3.2)
然后车辆上的数据将是:
vehicle('ABC 123',1,2,2,) #sports car
vehicle('DEF 456',1,6,,) #SUV
vehicle('GHI 789',2,,,1.2) #light van
vehicle('JKL 246',2,4,3,3.6) #heavy van
我的问题是如何确保vehicleForm
不显示vehicle_type
不需要的字段?我知道我可以传递{的实例{1}} vehicle_type
模板只显示vehicleForm
中vehicleForm
的元素,但这似乎是不必要的,并将逻辑移到模板中。 (我希望这一切都有道理)
答案 0 :(得分:1)
您可以将vehicle_type
传递给VehicleForm.__init__()
,然后添加一些自定义逻辑,例如,设置HiddenInput
不需要的字段的小部件。
基本示例(代码未经过测试)::
class VehicleForm(forms.ModelForm):
def __init__(self, vehicle_type, *args, **kwargs):
if vehicle_type.name == 'Car':
self.fields[some_field_for_trucks].widget = forms.HiddenInput()
super(VehicleForm, self).__init__(*args, **kwargs)
当您在视图中实例化VehicleForm
时,您只需将第一个参数作为用户选择的vehicle_type
传递。
查看动态表单的示例: