【问题标题】:Form is not saving user data into database Django表单未将用户数据保存到数据库 Django
【发布时间】:2018-05-16 15:23:05
【问题描述】:

Python 菜鸟在这里尝试学习一些非常简单的东西。

我正在尝试创建一个基本表单,该表单从用户那里获取一些个人信息并将其保存到一个 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')
]

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

我在这里做错了什么?

提前致谢!

【问题讨论】:

  • 不是问题,但您确实应该给事物起一致的名称。你的模型叫做userinfo,但是表单叫做NewList,保存的结果叫做Event。
  • 那你看到了什么,任何错误等等。你的行动路径是否有效?

标签: python html django forms django-models


【解决方案1】:

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

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 是用户的单人模式。因此可以通过 user.userinfo 获取它。

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

【讨论】:

  • 也许动作部分是这里的主要问题 :) p.s 但让我们看看操作员对此有何评论
  • 是的,我注意到事后甚至没有使用发布数据调用该函数。
  • 嗨,我试过了。我收到此错误:/home/newlist/ 全局名称“用户”处的 NameError 未定义
  • @user241691 主要问题是在表单操作中,您没有将 POST 数据发送到您没有设置来处理此数据的 url。您的逻辑与页面本身在同一个 url 中。通常可以按您的意愿工作。但是,您可以 POST 到执行某些操作的不同 URL,然后重定向您。但总是 POST 到处理数据的视图。我在关于实例部分的回答中添加了一些解释。
  • 我自己拥有的唯一书籍是hellowebbooks.com,它从头开始设置和部署 django 应用程序。免费赠品(可以购买硬拷贝)是obeythetestinggoat.com,它通过示例项目解释了如何进行 TDD。我还没有购买的另一个是twoscoopspress.com/products/two-scoops-of-django-1-8,这似乎是强烈推荐的。如果你想要一个更像“老师”的体验,teamtreehouse.com 实际上将代码挑战和测验作为课程的一部分。这些都是更基本的东西。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2020-02-16
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多