簡體   English   中英

Django ModelForm字段根據是否使用相關FK字段顯示

[英]Django ModelForm fields display based on whether related FK fields are used

我正在創建一個應用程序,用戶可以在其中設置對象和他們想要記錄的相應數據。 讓我給你舉個例子:

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不需要的字段? 我知道我可以將vehicle_type的實例傳遞給vehicleForm模板,並且僅顯示在vehicle_type中聲明的vehicleForm的元素,但這似乎沒有必要並將邏輯移動到模板中。 (我希望這一切都有意義)

您可以將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類型作為第一個參數傳遞。

查看動態 forms 的示例:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM