2016-09-23 172 views
1

这可能是一个简单的问题,但我不知道如何做到这一点。 我在Django有两个模型。自动填充Django OneToOneField

class ModelA(models.Model): 
    some_member = models.Charfield(...) 

class ModelB(models.Model): 
    model = OneToOneField(ModelA) 
    other_member = models.Charfield(...) 

ModelA通过的ModelForm填充,然后重定向到窗体为ModelB。 如何根据以前的表单自动填充OneToOneField。 谢谢你的帮助。


我这样做现在这个样子

class ModelBView(CreateView): 
....... 
    def form_valid(self, form): 
     model_b = form.save(commit=False) 
     model_a_form = ModelAForm(self.request.POST) 
     model_b.model = model_a_form.save(commit=False) 
     model_b.save() 
     return super(ModelBView, self).form_valid(form) 

,但得到的错误:“......不能创建因为数据未通过验证。”

所以这里的问题是,我只是可以通过request.POST从以前的形式获取数据。 我怎样才能得到这些数据。

回答

0

也许您可以将ModelA的ModelForm中的数据保存在request.session或request.get中,并重定向到ModelB的下一页,您可以在ModelB中获取model字段的数据,然后填充它。

+0

thx为快速回答。我是django的新手。我如何保存数据? – 5yn4x

0

这取决于你想要的东西。

如果要以第二种形式自动填充字段,则可以在实例化ModelB的表单(例如,在您的视图中)时使用initial关键字参数。是这样的:在处理时应

def my_view(request): 
    """ 
    Save data to ModelA and show the user the form for ModelB 
    """ 
    if request.method == 'POST': 
     # Save ModelA instance 
     model_a_form = ModelFormA(request.POST) 
     if model_a_form.is_valid(): 
      model_a_instance = model_a_form.save() 

      # Once saved, show the user the form for ModelB, prefilled 
      # with the result from the previous form 
      model_b_form = ModelFormB(initial={'model': model_a_instance}) 

      # etc. Render the page as usual 
     else: 
      # ... 
    elif request.method == 'GET': 
     # ... 

如果,另一方面,你不想MODELA出现在第二形式的领域,但它仍然链接到生成的实例,你可以做这样的事情第二种形式的回应。

# ... instance of first model is saved in `model_a_instance` 

# Initiate an empty instance of ModelB, with the value of `model` field set to model_a_instance 
model_b_instance = ModelB(model=model_a_instance) 

# Provide it as an instance to your model form 
model_b_form = ModelFormB(request.POST, instance=model_b_instance) 

if model_b_form.is_valid(): 
    # Everything else should work fine. 

希望这会有所帮助。

+0

Thx。我想做第二个。这非常有帮助。但我怎么能在CreateView类中做到这一点? – 5yn4x

+0

您必须重写视图的get()和post()方法,并在其中添加该逻辑。 –

+0

我试过这个,但是我得到错误“...因为数据没有验证而无法创建”。 – 5yn4x