2016-02-27 50 views
0

在下面的代碼顯示的示例中,是否可以使用LocalizacaoForm自動驗證並創建EnderecoCoordenada的實例?通過Django中的外鍵字段驗證多個相關對象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

您可以在LocalizacaoFormsave()方法創建的CoordenadaEndereco情況下,像這樣:

class LocalizacaoForm(forms.ModelForm): 

    # The rest of the form ... 
    # ... 

    def save(self, commit=False): 
     localizacao = super(LocalizacaoForm, self).save(commit=False) 

     # create an instance of Coordenada 
     coordenada = Coordenada.objects.create(
         latitude=self.cleaned_data['latitude'], 
         longitude=self.cleaned_data['longitude'], 
         altitude=self.cleaned_data['altitude'], 
         erro_horizontal=self.cleaned_data['erro_horizontal'] 
        ) 

     # create an instance of Endereco 
     endereco = Endereco.objects.create(
         cep=self.cleaned_data['cep'], 
         uf=self.cleaned_data['uf'], 
         localidade=self.cleaned_data['localidade'], 
        ) 

     # add those instances to localizacao 
     localizacao.coordenada_geografica = coordenada 
     localizacao.endereco = endereco 

     if commit: 
      localizacao.save() 
     return localizacao 
+0

就像一個魅力和看起來比如果我單獨創建的每個窗體乾淨多了。 謝謝! –

相關問題