Django用户个人资料模型表单数据没有显示在模板上,甚至没有给我一个错误!
我正在学习使用用户个人资料模型创建Django注册表单,我已经成功创建了注册表单和个人档案表单,但是我没有从models.py文件中获取任何值。
Models.py
class ExtenduserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
birth_date = models.DateField(null=True, blank=True)
age = models.IntegerField()
def __str__(self):
return self.user.username
@receiver(post_save,sender=User)
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile =
ExtenduserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
forms.py
class userprofile(forms.ModelForm):
birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD')
class Meta:
model = ExtenduserProfile
fields = ('age','birth_date')
views.py
@login_required()
def UserProfile(request,pk=None):
profile = ExtenduserProfile.objects.all()
return render(request,'dashboard/profile.html',{'profile':profile})
@login_required()
def HomeScreen(request):
if request.user.is_authenticated:
username = request.user.username
else :
username = 'not logged in'
context = {'username':username,'user':user}
return render(request,'dashboard/Home.html',context)
def singup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
user_profile = userprofile(request.POST)
if form.is_valid() and user_profile.is_valid():
user = form.save()
profile = user_profile.save(commit=False)
profile.user = user
profile.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username = username, password = password)
login(request,user)
return redirect(login_view)
else:
form = SignupForm()
user_profile = userprofile()
context = {'form':form, 'user_profile':user_profile }
return render(request,'account/signup.html',context)
HTML文件
{% extends 'dashboard/base.html' %}
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Profile</title>
</head>
{% block content%}
<body>
<h3>Welcome to profile page</h3><br>
{% if user.is_authenticated %}
<h4>Name = {{user.first_name}} {{user.last_name}}</h4>
<h4>Email = {{user.email}}</h4>
<h4>Age = {{user.ExtenduserProfile.age}} </h4>
<h4>DOB = {{user.ExtenduserProfile.birth_date}} </h4>
{% endif %}
</body>
{% endblock%}
</html>
我的预期输出应该是 名称:xyz 电子邮件:abc@abc.com 年龄:24 DOB:1994-04-21
答案 0 :(得分:1)
什么是扩展AbstractUser的自定义用户模型?
这是一个继承自AbstractUser的新用户模型。它需要特别注意,并通过settings.py更新一些参考。理想情况下,应在项目开始时完成,因为它将极大地影响数据库架构。实施它时要格外小心。
何时应使用扩展AbstractUser的自定义用户模型?
当您对Django处理身份验证过程非常满意并且您不会对其进行任何更改时,应该使用它。但是,您想直接在User模型中添加一些额外的信息,而不必创建额外的类。
我建议您使用摘要用户
针对您的案例,哪个更容易,最佳实践
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birth_date = models.DateField(null=True, blank=True)
也将此添加到您的设置中:
AUTH_USER_MODEL = 'appname.User'
选中此tutorial以获得更多信息
答案 1 :(得分:0)
好吧,当您在OneToOne中使用反向关系时,类名应全部小写(documentation
)。例如:
<h4>Age = {{user.extenduserprofile.age}} </h4>
<h4>DOB = {{user.extenduserprofile.birth_date}} </h4>
此外,为什么要从个人资料视图通过上下文将profile = ExtenduserProfile.objects.all()
发送到模板?因为如我所见,您没有使用它。因此,我认为您也可以删除该部分代码。
此外,您可以从模板中删除{% if user.is_authenticated %}
和{%endif%}
。这样,除非您登录,否则无法访问此模板。您已通过login_required
装饰器对其进行了限制。