Django - Пользователь, UserProfile и Admin
Я пытаюсь получить интерфейс Django Admin для отображения информации о моем профиле. Он отображает всех моих пользователей, но не содержит информации о профиле. Я не совсем уверен, как заставить его работать.
Я нашел этот код после быстрого поиска в Google:
from auth.models import UserProfile
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = UserProfile
class UserProfileAdmin(UserAdmin):
inlines = [UserProfileInline]
admin.site.register(User, UserProfileAdmin)
Однако, я не думаю, что это сработало. Когда я вхожу на страницу администрирования, я вижу пользователей, группы и сайты. Я нажимаю "Пользователи", и я вижу список всех моих пользователей, но никаких признаков какого-либо профиля. Нажатие на пользователя показывает мне информацию об этом пользователе, но по-прежнему не имеет информации о профиле.
Если это поможет, вот моя декларация модели:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
company = models.CharField(max_length=30)
user = models.ForeignKey(User, unique=True)
И мой регистрационный код:
def register(request):
if request.method == 'POST':
uf = UserForm(request.POST)
upf = UserProfileForm(request.POST)
if uf.is_valid() and upf.is_valid():
user = uf.save()
userprofile = upf.save(commit=False)#need to get the user profile object first
userprofile.user = user #then set the user to user
userprofile.save() #then save to the database
return HttpResponseRedirect('/auth/login/')
else:
uf = UserForm()
upf = UserProfileForm()
return render_to_response('register.html', dict(userform=uf,userprofileform=upf),context_instance=RequestContext(request))
Ответы
Ответ 1
Я не вижу точно, что не так, но вот немного более простой пример, который я знаю, работает. Поместите это любой рабочий admin.py. Попробуйте добавить конечную запятую к вашей встроенной строке - некоторые вещи разрываются без нее.
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from accounts.models import UserProfile
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = UserProfile
class UserProfileAdmin(UserAdmin):
inlines = [ UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)
Ответ 2
Это не совсем ответ на ваш вопрос. НО, согласно документации Django Admin, вы можете отображать информацию из UserProfile в вашей "таблице" пользователя. И вы можете сделать его доступным для поиска.
Это будет выглядеть примерно так (изменение ответа от C. Alan Zoppa):
class UserProfileAdmin(UserAdmin):
inlines = [ UserProfileInline, ]
def company(self, obj):
try:
return obj.get_profile().company
except UserProfile.DoesNotExist:
return ''
list_display = UserAdmin.list_display + ('company',)
search_fields = UserAdmin.search_fields + ('userprofile__company',)
У вас может быть проблема, хотя с поиском, если ваш класс профиля больше не называется UserProfile
.
Ответ 3
Недопустимая запятая не имеет значения. Я подозреваю, что проблема в том, что вы добавили новый admin.py
, но сервер разработки не узнал его. Если вы перезапустите сервер разработки, он увидит новый файл.