【问题标题】:Not getting model form values in template没有在模板中获取模型表单值
【发布时间】:2019-12-03 06:58:01
【问题描述】:

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 出生日期:1994-04-21

【问题讨论】:

  • 您在模板中使用了user,但在上下文中传递了user_profile
  • 在注册表格中,不在个人资料查看页面 user_profile 是表格,但我需要检索我通过 user_profile 保存的值

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


【解决方案1】:

好吧,当您在 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 装饰器对其进行了限制。

【讨论】:

  • 非常感谢先生,这对我有用
【解决方案2】:

什么是扩展 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了解更多信息

【讨论】:

  • AbstractUser 是干什么用的?抱歉,如果我问了一个不相关的问题,因为我是这个网站的新手
  • 我已经编辑了我的答案,检查一下..你也应该检查一下我从中学到的教程:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2020-08-22
  • 2019-10-15
  • 2023-03-31
  • 2012-11-08
相关资源
最近更新 更多