3

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

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 }}

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

4

3 回答 3

2

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

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

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

我只会评论其他答案,但似乎没有办法为我做到这一点。您需要结合 Alexey Sidorov 和 Like 它的答案:

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

After that you should setup signal that will automatically create UserProfile for each new user according to answer from alexey-sidorov.

于 2012-10-19T11:37:29.017 回答
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

于 2012-10-19T10:01:00.510 回答
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)

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

于 2012-10-19T10:33:02.393 回答