我正在尝试将字段添加到用户模型并将其添加到管理页面。 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_MODULEAUTH_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 }}
为什么不识别那个特定领域?
答案 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来做什么。