python - 如何将表单的输入与 Django 中的模型关联起来?

标签 python django

在 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)

我知道有一个类用于从模型创建表单,但即使在那里,我也不清楚数据实际上如何到达数据库。在继续讨论节省时间的部分之前,我想先了解内部工作原理。如果文档中有一个简单的示例说明其工作原理,我已经错过了。

谢谢。

更新: 需要明确的是 - 我确实了解 ModelForm 工具,我正在尝试弄清楚如何在没有该工具的情况下做到这一点 - 部分原因是我可以更好地理解它首先在做什么。

已回答:

在答案的帮助下,我得出了这个解决方案:

表单定义:

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

    model = ThisModel()

View 中的代码将输入的数据保存到数据库:

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 绝对看起来是一个更干净的解决方案。

最佳答案

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

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

将浏览器表单数据获取到表单对象中:

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 中提取的一个示例.

关于python - 如何将表单的输入与 Django 中的模型关联起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223763/

相关文章:

python - Django 可重用应用程序配置

python - ModelMultipleChoiceField 上的 Django 多值

python - 如何从 Python 获取 UTC 格式的文件修改日期

python - 如何使用正则表达式从python字符串中提取不同类型的子字符串?

python - Django REST框架: apply filter to list view but not detail view

django - 使用远程存储配置 django-compressor (django-storage - amazon s3)

django - 如何使用 Django 保存到远程服务器

python - 在企业 IE 和 Chrome 中使用某些 dcc 元素时出现 "Error loading dependencies"

python - 导入错误: No module named 'pkg_resources.extern.six.moves' ; 'pkg_resources.extern.six' is not a package

python - ImportError : Could not import settings 'settings.py' (Is it on sys. path?): No module named py