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')
]
所以当我去网址时,我看到了表格。然后我可以填写表单,但是当我提交表单时,数据不会进入数据库。
我在这里做错了什么?
提前致谢!
答案 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模型那就好了。