Поля Django ModelForm отображаются в зависимости от того, используются ли соответствующие поля FK - PullRequest
1 голос
/ 08 июня 2011

Я создаю приложение, в котором пользователи могут устанавливать объекты и соответствующие данные, которые они хотят записать. Позвольте привести пример:

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 шаблон и отображать элементы vehicleForm только если они объявлены в vehicle_type, но это кажется ненужным и перемещает логику в шаблон. (Надеюсь, все это имеет смысл)

1 Ответ

1 голос
/ 08 июня 2011

Вы можете передать 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, выбранный пользователем.

См. примерыдинамические формы:

...