Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表单未将用户数据保存到数据库Django中_Python_Html_Django_Forms_Django Models - Fatal编程技术网

Python 表单未将用户数据保存到数据库Django中

Python 表单未将用户数据保存到数据库Django中,python,html,django,forms,django-models,Python,Html,Django,Forms,Django Models,PythonNoob在这里试图学习一些非常简单的东西 我试图创建一个基本表单,从用户那里获取一些个人信息,并将其保存到一个sqlite3表中,其中用户的用户名作为主键 My models.py如下所示: class userinfo(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key= True, on_delete=models.CASCADE) name = mod

PythonNoob在这里试图学习一些非常简单的东西

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

My 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
class NewList(forms.ModelForm):

    class Meta:
        model = userinfo
        exclude = {'user'}
{% load static %}

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

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

<input type="submit">

</form>
urlpatterns = [
    url(r'^newlist/$', views.newlist, name='newlist')
]
forms.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
class NewList(forms.ModelForm):

    class Meta:
        model = userinfo
        exclude = {'user'}
{% load static %}

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

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

<input type="submit">

</form>
urlpatterns = [
    url(r'^newlist/$', views.newlist, name='newlist')
]
视图.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:

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
class NewList(forms.ModelForm):

    class Meta:
        model = userinfo
        exclude = {'user'}
{% load static %}

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

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

<input type="submit">

</form>
urlpatterns = [
    url(r'^newlist/$', views.newlist, name='newlist')
]
所以当我转到url时,我看到了表单。然后我可以填写表格,但当我提交表格时,数据不会进入数据库

我做错了什么


提前谢谢

我认为您所需要做的只是保存表单(如果表单有效),还可能添加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发送回newlist之外:

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

{% csrf_token %}
{{ form.as_p }}
</form>
实例就是它要保存到的模型,或者是从中复制数据的模型。在:
form=NewList(request.POST,instance=user.userinfo)
部分,它从表单中获取POST数据,并将其链接到user.userinfo的特定模型条目

userinfo只是为了让您能够获得正确的表单来保存,因为userinfo对于用户来说是一个onetoone模型。因此,可以使用user.userinfo获取它


form=NewList(instance=user.userinfo)
部分用于获取当前登录用户的userinfo,并在呈现之前复制到表单中,因此旧的userinfo数据将在html中预先填充到表单中。如果它有正确的userinfo模型,那么就可以了。

我认为您所需要做的就是保存表单(如果表单有效),也可以将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发送回newlist之外:

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

{% csrf_token %}
{{ form.as_p }}
</form>
实例就是它要保存到的模型,或者是从中复制数据的模型。在:
form=NewList(request.POST,instance=user.userinfo)
部分,它从表单中获取POST数据,并将其链接到user.userinfo的特定模型条目

userinfo只是为了让您能够获得正确的表单来保存,因为userinfo对于用户来说是一个onetoone模型。因此,可以使用user.userinfo获取它


form=NewList(instance=user.userinfo)
部分用于获取当前登录用户的userinfo,并在呈现之前复制到表单中,因此旧的userinfo数据将在html中预先填充到表单中。如果它有正确的userinfo模型就可以了。

这不是问题,但你真的应该给它起一致的名字。您的模型名为userinfo,但表单名为NewList,保存的结果名为Event。然后,您会看到什么,是否有任何错误等。您的操作路径是否正常?这不是问题,但您确实应该给出一致的名称。您的模型名为userinfo,但表单名为NewList,保存结果名为Event。您看到了什么,是否有任何错误等。您的操作路径是否正常?可能操作部分是这里的主要问题:)p.s.但让我们看看op对此有何评论是的,我注意到事实发生后,这个函数甚至没有被post数据调用。嗨,我试过这个。我得到了这个错误:/home/newlist/global name“user”中的namererror不是defined@user241691主要的问题是,在表单操作中,您没有将POST数据发送到您没有设置来处理此数据的url。您的逻辑与页面本身位于同一url中。这通常是你想要的。但是,您可以发布到另一个URL,然后重定向您。但始终发布到处理数据的视图。我在我的答案中添加了一些关于实例部分的解释。我自己拥有的唯一一本书是《从零开始设置和部署django应用程序》。免费赠品(可以购买硬拷贝)是一个例子,它解释了如何做TDD项目。另一个我还没有买的是,它似乎被强烈推荐。如果你想要一个更像“老师”的经验,他们的课程中实际上有代码挑战和测验。这些都涉及到更基本的东西。也许动作部分是这里的主要问题:)p.s.但是让我们看看op对它有什么看法是的,我注意到事实发生后,这个函数甚至没有被post数据调用。嗨,我试过这个。我得到了这个错误:/home/newlist/global name“user”中的namererror不是defined@user241691主要的问题是,在表单操作中,您没有将POST数据发送到您没有设置来处理此数据的url。您的逻辑与页面本身位于同一url中。这通常是你想要的。但是,您可以发布到另一个URL,然后重定向您。但始终发布到处理数据的视图。我在我的答案中添加了一些关于实例部分的解释。我自己拥有的唯一一本书是《从零开始设置和部署django应用程序》。免费赠品(可以购买硬拷贝)是一个例子,它解释了如何做TDD项目。另一个我还没有买的是,它似乎被强烈推荐。如果你想要一个更像“老师”的经验,他们的课程中实际上有代码挑战和测验。这些都是最基本的东西。