【问题标题】:Django extending user with userprofile (error: User has no profile.)Django 使用用户配置文件扩展用户(错误:用户没有配置文件。)
【发布时间】:2018-01-26 11:11:00
【问题描述】:

有人可以告诉我,为什么这段代码不起作用? 我正在尝试为用户创建一个注册表单。

我遇到了一个错误

“RelatedObjectDoesNotExist at /signup/client/2/ 用户没有个人资料。”

views.py

if request.POST:
            user_form = UserCreationForm(request.POST)
            profile_form = ProfileForm(request.POST)
            if user_form.is_valid() and profile_form.is_valid():
                user = user_form.save()
                user.profile.city="WW"
                user.profile.phone="32323"
                user.profile.save()

forms.py

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ( 'city', 'phone')

html文件

  <h2>Sign up</h2>
  <form method="post">
    {% csrf_token %}
    {{ user_form.as_p }}
    {{ profile_form.as_p }}
    <button type="submit">Sign up</button>

models.py

from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    city = models.TextField(max_length = 50)
    phone = models.TextField(max_length = 12)

【问题讨论】:

  • Yoshita Arora 的这个答案为我解决了这个问题。这是a link

标签: python django django-forms django-registration


【解决方案1】:

在开发过程中在这里做的最好和最简单的事情是:

  1. 在终端创建另一个超级用户-$ python manage.py createsuperuser
  2. 使用新凭据登录管理页面
  3. 删除旧管理员或任何可能在用户配置文件之前创建的用户 模型已创建

【讨论】:

  • 这是关于如何处理数据库不一致的建议,而不是问题的答案。请将此类建议添加为评论而不是答案。
【解决方案2】:

我相信这段代码是从“Django by Examples”中引用的。如果是这样,请转到您的应用程序管理站点并在配置文件帐户下手动添加配置文件并再次运行服务器。这将解决问题。

【讨论】:

  • 不,这是我自己的代码。手动添加配置文件?相反,它应该是自动创建的。
  • 在您的 model.py 中,您正在基于 User 模型和 OnetoOneField 创建配置文件。因此,您必须从管理站点创建配置文件。
【解决方案3】:

需要创建profile,保存user_form时不会创建

        user_form = UserCreationForm(request.POST)
        profile_form = ProfileForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            Profile.objects.create(**{
                 'city':"WW", 'phone': '32323', 'user': user
            })
            # ^^^^^^

【讨论】:

    【解决方案4】:

    您应该在脚本中添加以下行:

    profile = Profile.objects.create(user=request.user)
    

    【讨论】:

    • 欢迎您!这是对熊布朗的回答还是评论?请澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2017-07-14
    • 1970-01-01
    • 2013-06-19
    • 2015-07-08
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多