自动填充Django OneToOneField

时间:2016-09-23 09:20:16

标签: python django forms

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

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从前一个表单中获取数据。 我怎样才能获得这些数据。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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.

希望这有帮助。