这可能是一个简单的问题,但我不知道如何做到这一点。 我在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从前一个表单中获取数据。 我怎样才能获得这些数据。
答案 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.
希望这有帮助。