Django ModelForm字段根据是否使用相关的FK字段显示

时间:2011-06-08 11:40:21

标签: django django-models django-templates

我正在创建一个应用程序,用户可以在其中设置对象和要记录的相应数据。让我举个例子:

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模板只显示vehicleFormvehicleForm的元素,但这似乎是不必要的,并将逻辑移到模板中。 (我希望这一切都有道理)

1 个答案:

答案 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传递。

查看动态表单的示例: