表单数据未保存在django中
由于django用户模型中只有很少的字段,所以我创建了一个自定义模型,并使用它的ModelForm将数据保存到用户模型和自定义模型中。models.py如下所示表单数据未保存在django中,django,Django,由于django用户模型中只有很少的字段,所以我创建了一个自定义模型,并使用它的ModelForm将数据保存到用户模型和自定义模型中。models.py如下所示 from django.db import models from django.contrib.auth.models import User # Create your models here. import datetime class Post(models.Model): Author=models.ForeignKe
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
import datetime
class Post(models.Model):
Author=models.ForeignKey(User)
title=models.CharField(max_length=66)
content=models.TextField()
created_date=models.DateField(default=datetime.datetime.now())
published_date=models.DateField()
def publish(self):
self.published_date=datetime.datetime.now()
self.save()
class UserDetails(models.Model): #the custom model
uname=models.CharField(max_length=55)
first_name=models.CharField(max_length=55)
last_name=models.CharField(max_length=55)
age=models.IntegerField()
contact=models.CharField(max_length=13)
email=models.EmailField()
pword=models.CharField(max_length=55)
模型形式:
class RegisterForm(ModelForm):
class Meta:
model=UserDetails
fields=['uname','pword','first_name','last_name','email','contact']
views.py是这样的
from django.shortcuts import render
from .models import UserDetails
# Create your views here.
from django.contrib.auth import authenticate,login,logout
from .forms import RegisterForm,LoginForm,PostForm
from django.contrib.auth.models import User
from django.db import IntegrityError
def register(request):
if request.method=='POST':
form=RegisterForm(request.POST)
try:
if form.is_valid():
form.save()
uname=form.cleaned_data['uname']
fname=form.cleaned_data['first_name']
pword=form.cleaned_data['pword']
email=form.cleaned_data['email']
contact=form.cleaned_data['contact']
lname=form.cleaned_data['last_name']
user=User.objects.create_user(uname,password=pword,email=email)
user.last_name=lname
user.save()
#form.save()
#stuff after registration
message="registration done! login again"
return render(request,'register.html',locals())
except IntegrityError:
message="username already exists!! try another"
else:
form=RegisterForm()
return render(request,'register.html',locals())
问题是,即使我重新输入RegisterForm,我得到的“消息”是,用户名已经存在!!试试另一个。正在更新auth.User模型,但未更新UserDetails。我做错了什么?(如果这是一个愚蠢的问题,恕我直言:))
更新:1
from django.shortcuts import render
from .models import UserDetails
# Create your views here.
from django.contrib.auth import authenticate,login,logout
from .forms import RegisterForm,LoginForm,PostForm
from django.contrib.auth.models import User
from django.db import IntegrityError
def register(request):
if request.method=='POST':
form=RegisterForm(request.POST)
try:
if form.is_valid():
form.save()
uname=form.cleaned_data['uname']
fname=form.cleaned_data['first_name']
pword=form.cleaned_data['pword']
email=form.cleaned_data['email']
contact=form.cleaned_data['contact']
lname=form.cleaned_data['last_name']
if not User.objects.filter(username=uname,email=email).exists():
user=User.objects.create_user(uname,password=pword,email=email)
user.last_name=lname
user.save()
message="registration done! login again"
return render(request,'register.html',locals())
except IntegrityError:
message="username already exists!! try another"
else:
form=RegisterForm()
return render(request,'register.html',locals())
更多信息请参见
但是,我注意到,
age
model字段是必需的
。因此,save()。最好将其设置为:age=models.IntegerField(blank=True,null=True)
或定义如下的默认值age=models.IntegerField(default=20)
。尽管定义默认年龄很难,但最好按照blank=True null=True
允许空age
s。我不明白,模型表单字段中缺少年龄。。如果form.is\u valid()之后,我已经有了一个form.save()。那不管用吗?user.save()用于保存以更新auth.user模型。这正是我的意思。通过执行form.save()
将实例直接保存在数据库中(与表单数据一起保存)。之后,您将获取表单的数据并创建一个新用户。但是这个新用户已经用form.save()
创建了。哦!现在我明白了。您有两种不同的型号,UserDetails
和Post
,它们有一个ForeignKey
toUser
。我的错。请允许我修一下好的先生,我有一个UserDetails模型和一个标准的django.contrib.auth.User模型。我试图从UserDetails模型表单中填充数据,并使用它创建一个auth.User条目。用户条目完全不相关,但是您的UserDetail
模型应该在auth.User
上有一个OneToOneField
。这并不能回答问题问题若要评论或要求作者澄清,请在其帖子下方留下评论。-@丹尼斯,我是作者
if form.is_valid():
# save a UserDetails obj (data are automatically get from the form) to db.
form.save()
# Get data from form
uname = form.cleaned_data['uname']
fname = form.cleaned_data['first_name']
pword = form.cleaned_data['pword']
email = form.cleaned_data['email']
contact = form.cleaned_data['contact']
lname = form.cleaned_data['last_name']
# Check if user already exists. If it doesn't, create it
if not User.objects.filter(username=uname, email=email).exists():
user=User.objects.create_user(uname, password=pword, email=email)
#stuff after registration
message = "registration done! login again"
return render(request,'register.html',locals())