Django:扩展用户模型的问题

时间:2012-10-19 09:56:53

标签: django django-models django-admin

我正在尝试将字段添加到用户模型并将其添加到管理页面。 django docs中有一个推荐的方法:

https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

所以,我为我的新模型创建了一个OneToOne字段:

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    designs = models.ManyToManyField('Design', blank=True)
    prints = models.ManyToManyField('Print', blank=True)
    rating = models.IntegerField(null=True, blank=True)
    reliability = models.IntegerField(null=True, blank=True)
    av_lead_time = models.IntegerField(null=True, blank=True)

在settings.py:

中添加了AUTH_PROFILE_MODULE
AUTH_PROFILE_MODULE = 'website.UserProfile'

尝试将UserProfile字段添加到管理页面:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from website.models import UserProfile
from django.contrib.auth.models import User

# Define an inline admin descriptor for UserProfile model
# which acts a bit like a singleton
class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'

# Define a new User admin
class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

现在,当我尝试通过管理菜单访问注册用户时,我得到:

Caught DoesNotExist while rendering: User matching query does not exist.
In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
19            {{ field.field }}

当我尝试通过管理菜单添加新用户时,我得到:

Caught DoesNotExist while rendering: User matching query does not exist.
In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
19            {{ field.field }}

为什么不识别那个特定领域?

3 个答案:

答案 0 :(得分:2)

编辑:查看full error message后,我发现错误不仅与扩展用户有关。渲染复选框和相应的标签时会发生错误,这些标签用于将打印件分配给正在编辑/添加的UserProfile。 Django管理员调用Print .__ unicode__为每个Print实例呈现标签,然后访问(在/threedee/website/models.py的第33行)Print的“printer”属性,该属性是User的外键。并且由于某种原因,其中一个Prints确实具有无效的打印机值,并未指向任何用户。

如果没有看到Print模型,无法真正告诉我们这里发生了什么,我建议您检查Print数据库表(应该命名为website_print)并查找是否有任何异常(您使用的是PostgreSQL吗?)。如果您没有任何重要数据,截断整个Print表应该可以解决问题。

这是我应该遵循的旧答案,但与您遇到的错误无关:

我会评论别人的答案,但似乎没有办法为我做这件事。你需要结合Alexey Sidorov和喜欢它的答案:

首先使用django shell为现有用户创建UserProfile实例 - 只需在shell(python manage.py shell)中运行Like it's answer提供的commads。

之后,您应该设置信号,根据answer from alexey-sidorov自动为每个新用户创建UserProfile。

答案 1 :(得分:1)

在UserProfile类之后将其添加到models.py。

      from django.db.models.signals import post_save  
      def create_user_profile(sender, instance, created, **kwargs):
          if created:
              UserProfile.objects.create(user=instance)

      post_save.connect(create_user_profile, sender=User)

更多信息https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

答案 2 :(得分:1)

为现有用户添加UserProfile条目:

from django.contrib.auth.models import User
from website.models import UserProfile
for user in User.objects.all():
    profile = UserProfile.objects.get_or_create(user = user)

并为新用户创建个人资料。 使用signals来做什么。