在这里,一个 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 链接到用户模型。
我正在尝试使用 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 的有用评论/帮助:
现在表单正在正确保存(通过诊断和命令行检查确认。但是,当我返回表单时,它不显示现有数据。显示一个带有空数据字段的表单。据我所知,我m 正确传递实例数据。
是否有需要更改的 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 表达式保持不变。