Django ModelForm不保存数据到数据库

一个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关系可能导致问题?


Addenda,继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

为了完整user = models.OneToOneField(settings.AUTH_USER_MODEL) ,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 vs OneToOne,你绝对应该使用OneToOne。 关于使用ForeignKeys的建议在Django 1发布之前已经有一段时间了 - 这是大约五年前的事了 - 因为OneToOne的原始实现很差,并且正在改写。 您当然不会在这里找到任何建议使用FK的最新文档。

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

您应该回到在if语句中实例化表单的原始模式 - 但在else子句中执行时务必不要传递request.POST


UserDetailsForm(request.POST, instance = db_obj_form)

db_obj应该是要保存的表UserProfile的一个对象。

链接地址: http://www.djcxy.com/p/77263.html

上一篇: Django ModelForm not saving data to database

下一篇: Django Form won't render