Django extension User model, требуется дополнительное встроенное редактирование для расширенной модели - PullRequest
1 голос
/ 13 июня 2011

Я расширил модель пользователя django моделью "Member".Я хотел бы иметь возможность администрировать (на сайте администратора) пользователя - все данные из обеих моделей.Мне нужен адрес электронной почты и имя от пользователя, но все остальное от "члена".Я настроил его так, чтобы я мог получать все данные в одной форме, но я не могу продолжать добавлять связанную (дочернюю) информацию в «член», как обычно, если бы она не отображалась как встроенная модель пользователя.Вот моя попытка сделать это.В настоящее время он работает для отображения пользователя + участника, но не может отображать SaleItems (для участника).

from DjangoSite.ManageProducts.models import Member, SaleItem
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.admin import User

# cannot view this data from SaleItem model
class MemSalesInline(admin.TabularInline):
    model = SaleItem
    fk_name = 'Seller'

class MemberProfileInline(admin.StackedInline):
    model = Member
    fk_name = 'user'
    # this does not work
    inlines = [
                MemSalesInline,
            ]

class MyUserAdmin(UserAdmin):
    inlines = [MemberProfileInline,]

try:
    admin.site.unregister(User)
except admin.sites.NotRegistered:
    pass

admin.site.register(User, MyUserAdmin)

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Есть отличный учебник, в котором описывается, как это сделать: http://www.b -list.org / weblog / 2006 / jun / 06 / django-tips-extending-user-model /

Как правило, вы можете использовать AUTH_PROFILE_MODULE для соединения моделей пользователей и пользователей.Пример кода вызывает расширенную пользовательскую модель UserProfile, которую вы, возможно, захотите сделать.

Вот код из учебника:

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    url = models.URLField()
    home_address = models.TextField()
    phone_numer = models.PhoneNumberField()
    user = models.ForeignKey(User, unique=True)

# In Settings.py

AUTH_PROFILE_MODULE = 'myapp.UserProfile'

Теперь вы можете получить доступ к расширенной пользовательской модели.следующим образом:

from django.contrib.auth.models import User
u = User.objects.get(pk=1)
user_address = u.get_profile().home_address

"Во встроенной пользовательской модели есть метод get_profile (), который отключает этот параметр; если определено AUTH_PROFILE_MODULE, то вызов get_profile () для любого пользователя вернетсвязанный объект из вашего пользовательского класса. "

1 голос
/ 15 июня 2011

Я нашел решение, в котором я могу искать своих членов по User.email, user.first_name или user.last_name и получать записи об участниках + дочерние записи - и при этом легко возвращаться к записи пользователя, если мне нужно , Проблема, с которой я столкнулся, заключалась в том, что мне нужно было найти своих участников по полям пользователя. Вместо того, чтобы изменять сайт администратора пользователя (django's auth_user), я изменил свой сайт администратора участника (член является моим расширением пользователя django).

admin.py

from DjangoSite.ManageProducts.models import Member, SaleItem
from django.contrib import admin

class MemSalesInline(admin.TabularInline):
    model = SaleItem
    fk_name = 'Seller'

class MemberAdmin(admin.ModelAdmin):
        list_display = ['__str__', 'lname', 'fname'] # fname, lname not sortable
        raw_id_fields = ("user",)
        #this allows search "members" by User fields.
        search_fields = ['user__email', 'user__last_name', 'user__first_name']
    # include any child records here - child of "Member"
    inlines = [MemSalesInline,]

admin.site.register(Member, MemberAdmin)

models.py

class Member(models.Model):
    MemberID = models.AutoField(primary_key=True)
    Country = models.ForeignKey(dmCountry, blank=True, null=True)
    # plus more additional member info...
    # these allow me to view email, last name and first name in the Member admin list page.
    def __str__(self):
        return "%s" % self.user.email
    def lname(self):
        return "%s" % self.user.last_name
    def fname(self):
        return "%s" % self.user.first_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...