【发布时间】:2013-08-19 11:47:39
【问题描述】:
这里的 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(如上)还是使用 OneToOne 链接到 User 模型。
我正在尝试使用 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() 为空。我在上面的视图中在 save() 之后尝试过这个,也在 Django 控制台上尝试过。
这是我的模板:
<form method="POST" action="">
<table>{{ form }}</table>
<input type="submit" value="Update" />
{% csrf_token %}
</form>
目前的主要问题是表单数据没有保存到数据库中。我不知道是否正在读取(一旦我在数据库中有一些数据......)
一个想法是User 关系可能会导致问题?
继 Daniel Roseman 的有用评论/帮助之后的附录:
现在表单正在正确保存(通过诊断和命令行检查确认。但是当我返回表单时,它不显示现有数据。显示一个带有空数据字段的表单。据我所知,我正确地传递了实例数据。
是否有需要更改的 ModelForm 设置?
这是修改后的视图:
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 表达式未更改。
【问题讨论】:
-
也许可以尝试取出
if f.is_valid(),看看当你尝试保存它时它可能会抛出什么异常。 -
它不会抛出任何异常。我的诊断也显示 is_valid() 返回 true
标签: django django-models django-1.5