【问题标题】:How can I extend a user profile in django?如何在 django 中扩展用户配置文件?
【发布时间】:2012-07-22 22:16:15
【问题描述】:

我正在尝试使用此处找到的其他一些问题/答案以及网络上的教程来扩展用户配置文件。我正在尝试将 UserProfile 模型包含在管理员中,以便我可以更改配置文件的详细信息(暂时暂时),但即使我在 admin.py 中包含 UserProfile 后它也没有显示,这让我相信我是这里做错了什么。

model.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    quote = models.CharField('Favorite quote', max_length =  200)

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)

urlconf

(r'^accounts/register/$', 'register'),

view.py 中注册用户的视图

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect('reserve/templates/index.html')
    else:
        form = UserCreationForm()
    c = {'form': form}
    return render_to_response("registration/register.html", c, context_instance=RequestContext(request))

admin.py

from reserve.models import UserProfile
from django.contrib import admin
admin.site.register(UserProfile)

【问题讨论】:

  • UserProfile 应该是 OneToOne 和 User。你的models.py中的缩进是否正确?看起来不对……
  • 能否包含admin.py
  • @ColinDunklau: ForeignKey(unique=True) OneToOneField.
  • @scytale:添加了 admin.py

标签: python django django-models django-admin


【解决方案1】:

常见的方法是在User编辑页面中内联UserProfile,在INSTALLED_APPS'django.contrib.auth'之后的一个应用程序的admin.py中:

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

class UserProfileInline(admin.TabularInline):
    model = UserProfile

class UserWithProfileAdmin(UserAdmin):
    inlines = [UserProfileInline]

admin.site.unregister(User)
admin.site.register(User, UserWithProfileAdmin)

此外,您可以将ForeignKey 本身用作primary_key

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    quote = models.CharField('Favorite quote', max_length =  200)

这样,您可以节省代理 id 的成本,并保持用户配置文件的 id 与用户相同。这将启用UserProfile.objects.get(pk=user_id)(当然user.get_profile() 仍然可用)

【讨论】:

  • 我编辑了 admin.py 使其看起来像上面的代码,但我仍然无法让 UserProfile 显示在 django admin 中。
  • @sharataka 哎呀我忘记了注册部分,请查看编辑。
  • 我添加了两行(注销/注册),但在 django 管理员中仍然不可见。我也尝试过没有取消注册行,但仍然无法正常工作。我不确定我哪里出了问题。
  • @sharataka “在 django 管理员中不可见”是什么意思,是否有添加/更改/删除 User 的行?
猜你喜欢
  • 2015-07-08
  • 2012-03-11
  • 2013-06-19
  • 2017-04-26
  • 2016-07-29
  • 1970-01-01
  • 2018-01-26
  • 2012-04-30
  • 2011-02-19
相关资源
最近更新 更多