Как разделить поля моделей по ролям или группам в Django - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть приложение под названием "Фрукты" с двумя пользователями, типа Продавец и Покупатель.У каждого типа пользователя есть свои поля:

У продавца есть поля

  • Номер телефона
  • Расположение
  • Название магазина
  • Часы работы

У покупателя есть поля

  • Номер телефона
  • Адрес

Поскольку у каждого пользователя есть поля с номерами телефонов, я создаю эти поля в пользовательской модели 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.

Как это сделать.

...