【问题标题】:Connect to User Model in Django在 Django 中连接到用户模型
【发布时间】:2012-03-31 09:26:09
【问题描述】:

快速(可能是愚蠢的)问题。这是我网站的流程:用户登录并被重定向到自定义管理页面。在此管理页面上,他们可以创建“个人资料”。我想将他们创建的配置文件与其用户数据相关联,以便 1 个用户关联到 1 个配置文件。

由于某种原因,以下不起作用(只是尝试关联

UserAdmin.Models

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    username = models.ForeignKey(User)
    firstname = models.CharField(max_length=200)
    lastname = models.CharField(max_length=200)
    email = models.EmailField(max_length=200)

    def __unicode__(self):
        return self.username

UserAdmin.Views

def createprofile(request):

    user = User.objects.get(id=1)
    profile = Profile(username=user, firstname='Joe', lastname='Soe', email='Joe@Soe.com')
    profile.save()

我不断收到:表 useradmin_profile 没有名为 username_id 的列

有什么想法吗?赞赏。

编辑:

删除了我的数据库并运行了一个新的同步数据库,更改为用户名 = models.OneToOneField(User)。现在我得到 Cannot assign "u'superuser'": "Profile.username" must be a "User" instance.

【问题讨论】:

标签: python django models


【解决方案1】:

UserAdmin.Models

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User)

    def __unicode__(self):
        return self.user.get_full_name()

UserAdmin.Views

def createprofile(request):

    user_ = User.objects.get(pk=1)
    profile = Profile(user=user_)
    profile.user.first_name = 'Joe'
    profile.user.last_name = 'Soe'
    profile.user.email = 'Joe@Soe.com'
    profile.user.save()
    profile.save()

【讨论】:

  • 嗯,谢谢。现在我得到:无法分配“u'John'”:“Profile.username”必须是“User”实例。 (John 是一个 User.username)
  • 编辑了代码...试试看。不过,您将不得不做一个新的同步数据库。
  • 嗯。好的,用新的同步数据库尝试过。当我尝试访问 print a.first_name where a = User 时,shell 打印出一个空白。当我尝试访问 Profile 对象并执行 Profile.objects.all() 时,我会打印 [] 而不是 full_name()。有什么想法吗?
  • 是的,我在视图中有这个,尝试了有没有这条线。仍然没有正确创建配置文件。有什么想法吗?
【解决方案2】:

您在拥有 username ForeignKey 字段之前同步了 Profile 模型。 Django 只会创建表,但一旦创建就不会更改它们。这是一个列出您的选项的答案: https://stackoverflow.com/a/7693297/990224.

您应该考虑将username 重命名为user

【讨论】:

  • 删除数据库并执行新的同步数据库并没有解决问题,如另一个答案中所述。
  • 好吧,你必须决定是要保存用户名还是用户。 Cannot assign "u'superuser'": "Profile.username" must be a "User" instance 告诉您的是您正在尝试将用户名保存在 Profile.username 中。但 Profile.username 必须是用户。因此,要么传递用户,要么将 OneToOneField 更改为 CharField。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2021-11-12
  • 2021-08-24
  • 2016-04-27
  • 1970-01-01
  • 2018-08-17
  • 2015-03-16
  • 2012-12-14
相关资源
最近更新 更多