代码之家  ›  专栏  ›  技术社区  ›  chernevik

如何将表单的输入与Django中的模型相关联?

  •  2
  • chernevik  · 技术社区  · 15 年前

    在Django中,如何将表单与模型关联,以便将输入表单的数据插入与模型关联的数据库表中?如何将用户输入保存到该数据库表中?

    class PhoneNumber(models.Model):
        FirstName = models.CharField(max_length=30)
        LastName = models.CharField(max_length=30)
        PhoneNumber = models.CharField(max_length=20)
    
    class PhoneNumber(forms.Form):
        FirstName = forms.CharField(max_length=30)
        LastName = forms.CharField(max_length=30)
        PhoneNumber = forms.CharField(max_length=20)
    

    我知道有一个从模型创建表单的类,但即使在那里,我也不清楚数据实际上是如何到达数据库的。我想先了解一下内部的工作原理,然后再谈省时的方法。如果在文档中有一个简单的例子说明这是如何工作的,那么我就错过了。

    谢谢

    更新:

    回答:

    在anwers的帮助下,我得出了以下解决方案:

    class ThisForm(forms.Form)
        [various Field assignments]
    
        model = ThisModel()
    

    在视图中编码以将输入的数据保存到数据库:

    if request_method == 'POST':
        form = ThisForm(request.POST)
        if form.is_valid():
            for key, value in form.cleaned_data.items():
                setattr(form.model, key, value)
            form.model.save(form.model)
    

    在此之后,在浏览器表单中输入的数据将保存在数据库表中。

    请注意,调用模型的save()方法需要将模型本身作为参数传递。我不知道为什么。

    警告:我是新手。这成功地将数据从浏览器传输到了数据库表,但上帝只知道我忽略了什么、遗漏了什么或完全破坏了什么。ModelForm显然是一个更干净的解决方案。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Adam    15 年前

    当我第一次使用表单和模型(不使用ModelForm)时,我记得我所做的是检查表单是否有效,这将设置清理后的数据,手动将数据从表单移动到模型(或任何其他您想要执行的处理),然后保存模型。可以看出,当表单与模型完全(甚至非常接近)匹配时,这是非常乏味的。通过使用ModelForm(因为您说您不太确定它是如何工作的),当您保存ModelForm时,它会根据模型规范用表单数据实例化一个对象,然后为您保存该模型。总而言之,数据流从HTML表单到Django表单,到Django模型,再到DB。

    您的问题的一些实际代码:

    if request.method == 'POST':
        form = SomeForm(request.POST)
        if form.is_valid():
            model.attr = form.cleaned_data['attr']
            model.attr2 = form.cleaned_data['attr2']
            model.save()
    else:
        form = SomeForm()
    return render_to_response('page.html', {'form': form, })
    

    在模板页面中,您可以使用表单执行以下操作:

    <form method="POST">
    {{ form.as_p }}
    <input type="submit"/>
    </form>
    

    here

        2
  •  2
  •   gavoja    15 年前

    form_for_model (不记得确切的名字;那是在1.0版本发布之前)。现在我想这样说:

    import myproject.myapp.models as models
    
    class PhoneNumberForm(forms.ModelForm):
        class Meta:
            model = models.PhoneNumber
    

    要了解元类背后的魔力,您必须查看代码,因为有很多东西需要解释:]。表单的构造函数可以采用 instance here .

        3
  •  1
  •   vmj    15 年前

    ModelForm.save 文件应该对此进行解释。对于它的基类(Form),您需要使用Form.cleaned_data()获取字段值,并“手动”将它们设置为适当的模型字段。ModelForm为您完成了所有这些。

        4
  •  0
  •   shanyu    15 年前

    Django文档对这个主题非常清楚。但是,这里有一个粗略的入门指南:您可以覆盖表单的保存方法,也可以在视图中实现该功能。

    if form.is_valid() # validation - first the fields, then the form itself is validated
        form.save()
    

    def save(self, *args, **kwargs):
        foo = Foo()
        foo.somefield = self.cleaned_data['somefield']
        foo.otherfield = self.cleaned_data['otherfield']
        ...
        return foo.save()