gpt4 book ai didi

Django ModelForm 不将数据保存到数据库

转载 作者:行者123 更新时间:2023-12-03 15:08:20 26 4
gpt4 key购买 nike

这里的 Django 初学者在让表单工作时遇到了很多麻烦。是的,我已经完成了教程并浏览了很多网络 - 我所拥有的是我在这里和其他网站上找到的东西的混合。我使用的是 Python 2.7 和 Django 1.5。 (虽然官方文档很广泛,但它往往假设您已经了解其中的大部分内容 - 不适合作为初学者引用甚至高级教程)

我正在尝试为“扩展”用户详细信息创建一个表单 - 例如。公司名称、街道地址等,但未将表单数据保存到数据库中。

最初我尝试创建一个扩展标准 User 的模型。模型,但我放弃了 - 需要修改太多,而且在这个阶段我已经超出了我的范围。
因此,我创建了一个名为 UserProfile 的新模型。 :

class UserProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True)
company = models.CharField(max_length=50, blank=True)
address1 = models.CharField(max_length=50, blank=True)
address2 = models.CharField(max_length=50, blank=True)
city = models.CharField(max_length=20, blank=True)
region = models.CharField(max_length=20, blank=True)
postcode = models.CharField(max_length=10, blank=True)
country = models.CharField(max_length=20, blank=True)
phone = models.CharField(max_length=30, blank = True)

关于是否应该使用 ForeignKey 链接到 User 模型,我在网上看到了不同的引用资料。 (如上)或使用 OneToOne。

我正在尝试使用 ModelForm (保持简单,应该是一个简单的表单)。这是我的 forms.py
from django.forms import ModelForm
from .models import UserProfile

class UserDetailsForm(ModelForm):
class Meta:
model = UserProfile
fields = ['company','address1','address2','city','region', 'postcode','country','phone']

这是我的观点:
def UserDetailsView(request):
#f = 0
if request.method == 'POST':
f = UserDetailsForm(request.POST, instance = request.user)
if f.is_valid():
f.save()
else:
f = UserDetailsForm(request.POST , instance = request.user)

print "UserDetails objects: ", (UserProfile.objects.all())

return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))

(是的,UserProfile 与 UserDetail 存在不一致 - 这是我所有黑客的产物,一旦我开始工作就会修复)

诊断显示 f.is_valid()返回 True。
同样,诊断显示 UserProfile.objects.all()作为空。我在上面的 View 中在 save() 之后尝试了这个,也在 Django 控制台中尝试过。

这是我的模板:
 <form method="POST" action="">
<table>{{ form }}</table>
<input type="submit" value="Update" />
{% csrf_token %}
</form>

目前的主要问题是表单数据没有保存到数据库中。我不知道是否正在被读取(一旦我在数据库中有一些数据......)

一种想法是 User关系可能会导致问题?

附录,来自 Daniel Roseman 的有用评论/帮助:

现在表单正确保存(通过诊断和命令行检查确认。但是,当我返回表单时,它没有显示现有数据。显示了一个带有空数据字段的表单。据我所知,我m 正确传递实例数据。

是否有需要更改的 ModelForm 设置?

这是修改后的 View :
def UserDetailsView(request):
#print "request co:", request.user.profile.company
f = UserDetailsForm(request.POST, instance = request.user.profile )

if request.method == 'POST':
if f.is_valid():
profile = f.save(commit=False)
profile.user = request.user
profile.save()

return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))

诊断显示 request.user.profile设置正确(特别是公司字段)。但是,表单显示为空字段。 HTML 源代码也不显示任何数据值。
作为额外的检查,我还尝试了一些模板诊断:
<table border='1'>
{% for field in form%}
<tr>
<td>{{field.label}}</td>
<td>{{field.value}}</td>
</tr>
{% endfor%}
</table>

这正确列出了字段标签,但所有值都报告为 None .

为完整起见,UserProfile 的用户字段现在定义为 user = models.OneToOneField(settings.AUTH_USER_MODEL)并且 User.profile lambda 表达式保持不变。

最佳答案

我不确定这里的问题到底是什么,但一个问题肯定是你通过了 instance=request.user实例化表单时。那绝对是错误的:request.user是 User 的一个实例,而表单基于 UserProfile .

相反,你想要做这样的事情:

f = UserDetailsForm(request.POST)
if f.is_valid():
profile = f.save(commit=False)
profile.user = request.user
profile.save()

至于 ForeignKey 与 OneToOne,您绝对应该使用 OneToOne。关于使用 ForeignKeys 的建议是在 Django 1 发布的准备阶段给出的——差不多五年前了——因为 OneToOne 的原始实现很差,它应该被重写。您当然不会在此处找到任何建议使用 FK 的最新文档。

评论后编辑 现在的问题是您正在使用第一个参数 data 实例化表单,即使请求不是 POST,因此是 request.POST是一本空字典。但是 data 参数,即使它是空的,也优先于作为初始数据传递的任何内容。

您应该回到在 if 中实例化表单的原始模式。声明 - 但一定不要通过 request.POSTelse 中这样做时条款。

关于Django ModelForm 不将数据保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com