【问题标题】:Auto-fill Django OneToOneField自动填充 Django OneToOneField
【发布时间】:2016-09-23 09:20:15
【问题描述】:

这可能是一个简单的问题,但我不知道该怎么做。 我在 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 从之前的表单中获取数据。 我怎样才能得到这些数据。

【问题讨论】:

    标签: python django forms


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回答。我是 Django 的新手。如何保存数据?
    【解决方案2】:

    这取决于你到底想要什么。

    如果您想在第二个表单中自动填充该字段,那么您可以在为 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.
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我想做第二个。这很有帮助。但是我如何在 CreateView 类中做到这一点?
    • 您必须覆盖视图的 get()post() 方法并在其中添加该逻辑。
    • 我试过这个,但我得到错误“...无法创建,因为数据没有验证”。
    • 我认为是问题所在。使用 request.POST,我只从当前表单中获取数据。但不是从以前的形式
    • 我想我明白了。我可以在 get_initial 中获取 postdata
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多