У меня есть приложение под названием "Фрукты" с двумя пользователями, типа Продавец и Покупатель.У каждого типа пользователя есть свои поля:
У продавца есть поля
- Номер телефона
- Расположение
- Название магазина
- Часы работы
У покупателя есть поля
Поскольку у каждого пользователя есть поля с номерами телефонов, я создаю эти поля в пользовательской модели Django следующим образом:
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Master
class User(AbstractUser):
telephone = models.PositiveIntegerField(null=True, blank=True)
class Meta:
permissions = (
("seller", "Seller"),
("buyer", "Buyer"),
)
# Seller
class Customer(models.Model):
user = models.OneToOneField(User, verbose_name="user_id", db_column="user_id", related_name="profile", on_delete=models.CASCADE)
location = models.CharField(max_length=255, null=True)
shop_name = models.CharField(max_length=255, null=True)
open_hours = models.TextField(max_length=500, null=True)
# Buyer
class Customer(models.Model):
user = models.OneToOneField(User, verbose_name="user_id", db_column="user_id", related_name="profile", on_delete=models.CASCADE)
address = models.TextField(max_length=500, null=True)
И в admin.py ;
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.forms import TextInput, Textarea, NumberInput
from django.db import models
from .models import User
from .models import Seller
from .models import Buyer
admin.site.register(User)
class SellerProfileInline(admin.StackedInline):
model = Seller
can_delete = False
verbose_name = "Seller Profile"
verbose_name_plural = "Seller Profile"
fk_name = "user"
class BuyerProfileInline(admin.StackedInline):
model = Buyer
can_delete = False
verbose_name = "Buyer Profile"
verbose_name_plural = "Buyer Profile"
fk_name = "user"
class CustomUser(UserAdmin):
inlines = [SellerProfileInline, BuyerProfileInline]
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'telephone')
fieldsets = (
(None, {'fields': ('username', 'password')}),
('Personal info', {'fields': ('first_name', 'last_name', 'email', 'telephone')}),
('Permissions', {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
}),
('Important dates', {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'password1', 'password2', 'groups', 'user_permissions'),
}),
)
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':40})},
models.PositiveIntegerField: {'widget': NumberInput(attrs={'size':10})},
models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
}
admin.site.unregister(User)
admin.site.register(User, CustomUser)
Это работает, но поля от Продавца и Покупателя появляются на нижней странице профиля редактирования.Я хочу, чтобы у каждой роли пользователя были определенные модели, поэтому у них разные поля.
Объяснение; Администратор, создающий первого пользователя, выбирает роль, для этого я перемещаю группу выбора и роль / разрешение на добавление страницы пользователя.(см. add_fieldsets
).Но в профиле пользователя появляются поля от двух моделей (Продавец и Покупатель).Я хочу разделить каждое поле по роли.Таким образом, поля Location, Shop Name, Open Hours
появляются у пользователя с ролью Seller
.Поля Address
появляются у пользователя с ролью Buyer
.
Как это сделать.