在Django ModelForm

时间:2016-02-27 03:23:43

标签: django django-models django-forms modelform

在下面的代码所示的示例中,是否可以使用Endereco自动验证和创建CoordenadaLocalizacaoForm的实例?

我想这样做的原因是我可以尽可能地使用通用视图,并且它们不能正常工作(至少不是开箱即用)每个视图有多个ModelForm

在应用程序中,我想呈现LocalizacaoForm并显示EnderecoCoordenada中的字段。我到目前为止所做的似乎并没有解决它,因为self.fields.update(fields_for_model(Coordenada))只创建输入字段,而不是Coordenada的实际实例。因此,我得到django NOT NULL constraint failed id对象 coordenada

有没有办法做我想要的或者我应该坚持分别渲染每个表格?

#models.py
class Coordenada(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()
    altitude = models.FloatField()
    erro_horizontal = models.FloatField()

class Endereco(models.Model):
    cep = models.IntegerField()
    uf = models.CharField(max_length=2)
    localidade = models.CharField(max_length=50)  # nome da cidade
    # other fields...

class Localizacao(models.Model):
    endereco = models.OneToOneField(Endereco)
    coordenada_geografica = models.ForeignKey('Coordenada')

#forms.py
class LocalizacaoForm(forms.ModelForm):

    def __init__(self, instance=None, *args, **kwargs):
        super(LocalizacaoForm, self).__init__(instance=instance, *args, **kwargs)
        # Retrieve the fields from Endereco and Coordenada model and update the fields with it
        self.fields.update(fields_for_model(Endereco))
        self.fields.update(fields_for_model(Coordenada))

    class Meta:
        model = Localizacao
        exclude = ('endereco', 'coordenada_geografica')

#views.py
class LocalizacaoCreateView(generic.CreateView):
    model = Localizacao
    form_class = LocalizacaoForm
    template_name = 'localizacao_create_form.html'

1 个答案:

答案 0 :(得分:2)

您可以在Coordenada的{​​{1}}方法中创建Enderecosave()的实例,如下所示:

LocalizacaoForm