未在模板中获取模型表单值

时间:2019-07-25 04:45:42

标签: python django django-models django-forms django-views

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

2 个答案:

答案 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装饰器对其进行了限制。