#django #inline #extend
#django #встроенное #расширить
Вопрос:
Я расширил пользовательскую модель django моделью «Member». Я хотел бы иметь возможность администрировать (на сайте администратора) пользовательские данные из обеих моделей. Мне нужны адрес электронной почты и имя от пользователя, но все остальное — от «Участника». Я настроил это так, чтобы я мог получать все данные в одной форме, но я не могу продолжать добавлять связанную (дочернюю) информацию к «Члену», как я обычно делал бы, если бы она не отображалась как встроенная модель пользователя. Вот моя попытка сделать это. В настоящее время он работает, чтобы показать User 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)
Ответ №1:
Есть отличный учебник, который описывает, как это сделать: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model /
В принципе, вы можете использовать AUTH_PROFILE_MODULE для подключения ваших моделей User и Member. Пример кода вызывает 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. спасибо, именно так у меня это уже настроено. Теперь я хочу управлять дочерними записями User Member Member на сайте администратора django, но, похоже, существуют некоторые ограничения.
Ответ №2:
Я нашел решение, при котором я могу искать своих участников по User.email, user.first_name или user.last_name и получать обратно записи участников дочерние записи — и при этом легко возвращаться к записи пользователя, если мне нужно. Проблема, с которой я столкнулся, заключалась в том, что мне нужно было иметь возможность находить своих участников по пользовательским полям. Вместо изменения сайта администратора пользователя (auth_user django), я изменил свой сайт администратора участника (участник является моим расширением пользователя 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