表单不会将用户数据保存到数据库Django中

时间:2017-12-02 19:32:11

标签: python html django forms django-models

Python noob在这里尝试学习非常简单的东西。

我尝试创建一个基本表单,从用户那里获取一些个人信息并将其保存到sqlite3表中,并以用户的用户名作为主键。

我的models.py看起来像这样:

class userinfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key= True, 
on_delete=models.CASCADE)
    name = models.CharField(max_length = 200, blank = True)
    email = models.EmailField(max_length= 300, default = 'Null')
    phone = models.CharField(max_length= 10, default = 'Null')

def __unicode__(self):
    return self.user

forms.py:

class NewList(forms.ModelForm):

    class Meta:
        model = userinfo
        exclude = {'user'}

views.py

def newlist(request):
    if request.method == 'POST':
        form = NewList(request.POST)
        if form.is_valid():
            Event = form.save(commit = False)
            Event.save()
            return redirect('/home')

    else:
        form = NewList()

    return render(request, 'home/newlist.html', {'form': form})

HTML:

{% load static %}

<form action="/home/" method="post">

{% csrf_token %}
{{ form.as_p }}

<input type="submit">

</form>

urls.py,但我不知道这会有什么帮助:

urlpatterns = [
    url(r'^newlist/$', views.newlist, name='newlist')
]

所以当我去网址时,我看到了表格。然后我可以填写表单,但是当我提交表单时,数据不会进入数据库。

我在这里做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

我认为您需要做的只是保存表单,如果它有效,可能还会将userinfo添加为表单的实例。您也从表单中排除用户,需要手动分配。

def newlist(request):
    if request.user.is_authenticated():
        user = request.user

        if request.method == 'POST':
            form = NewList(request.POST, instance=user.userinfo)
            if form.is_valid():
                form.save(commit=false)  
                form.user = user          
                form.save()
                return redirect('/home')
        else:
            form = NewList(instance=user.userinfo) # add this if you want it to automatically fill the form with the old data if there is any.

    return render(request, 'home/newlist.html', {'form': form})

其余的看起来应该有效。除非您需要将帖子URL发送回新列表:

{% load static %}
<form action="/newlist/" method="POST">

{% csrf_token %}
{{ form.as_p }}
</form>

如果在第一次创建模型时分配了用户,则不需要用户保存,但由于这样可以保存用户数据,因此您需要确保他们已登录:

def newlist(request): 
    if request.user.is_authenticated(): 
        user = request.user 
        if request.method == 'POST':
            form = NewList(request.POST, instance=user.userinfo)
            if form.is_valid():          
                form.save()
                return redirect('/home')
        else:
            form = NewList(instance=user.userinfo) # add this if you want it to automatically fill the form with the old data if there is any.

    return render(request, 'home/newlist.html', {'form': form})

实例是要保存到或从中复制数据的模型。在:form = NewList(request.POST, instance=user.userinfo)部分,它从表单中获取POST数据,并将其链接到user.userinfo的特定模型条目,但是,it will only save to the database when you call form.save().

user.userinfo正好让您可以获得正确的表单以保存,因为userinfo是用户的onetoone模型。因此可以使用user.userinfo获取它。

form = NewList(instance=user.userinfo)部分是当前登录用户的userinfo所在的位置,并在呈现之前复制到表单中,因此旧的userinfo数据将预填充到html中的表单中。如果它得到了正确的userinfo模型那就好了。