У меня есть две модели:
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
from django.utils.text import slugify
class User(AbstractUser):
ROLE_CHOICES = (
('employee', 'Сотрудник'),
('admin', 'Админ'),
)
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='employee', verbose_name='Роль')
workshop = models.IntegerField(verbose_name='Цех', null=True, blank=True, editable=False)
department = models.IntegerField(verbose_name='Отдел', null=True, blank=True, editable=False)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Device(models.Model):
inventory_number = models.CharField(
max_length=50, verbose_name='Инвентарный номер',
unique=True, null=True, blank=True,
editable=False
)
workshop = models.IntegerField(verbose_name='Цех')
department = models.IntegerField(verbose_name='Отдел')
number_computer = models.IntegerField(
verbose_name='Номер ПК в отделе',
editable=False, default=0
)
def __str__(self):
return self.inventory_number if self.inventory_number else f'Новое устройство (Цех: {self.workshop}, Отдел: {self.department})'
def save(self, *args, **kwargs):
if not self.pk or not self.inventory_number:
last_device_in_department = Device.objects.filter(
workshop=self.workshop,
department=self.department
).order_by('-number_computer').first()
if last_device_in_department:
self.number_computer = last_device_in_department.number_computer + 1
else:
self.number_computer = 1
workshop_str = f"{self.workshop:02d}"
department_str = f"{self.department:03d}"
pc_number_str = f"{self.number_computer:02d}"
self.inventory_number = f"PC{workshop_str}_{department_str}_{pc_number_str}"
super().save(*args, **kwargs)
class Meta:
verbose_name = 'Оборудование'
verbose_name_plural = 'Оборудование'
unique_together = ('workshop', 'department', 'number_computer')
ordering = ['workshop', 'department', 'number_computer']
и еще реализована админка, но только для Device:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import User, Device, Incident, ComponentOrder
# Register your models here.
@admin.register(Device)
class DeviceAdmin(admin.ModelAdmin):
list_display = ('inventory_number', 'user', 'workshop', 'department', 'number_computer')
list_filter = ('workshop', 'department')
search_fields = ('inventory_number', 'user__username', 'user__first_name', 'user__lastname')
readonly_fields = ('inventory_number', 'number_computer')
def get_fieldsets(self, request, obj=None):
if not obj: # Форма создания
return (
(None, {'fields': ('user', 'workshop', 'department')}),
)
return super().get_fieldsets(request, obj)
С девайсом все хорошо, Сам создается инвентарный номер с помощью цеха и отдела в функции save.
Что я хочу сделать, но не могу понять?
В девайсе будет выбор User, но он останется пустым, то есть null И blank true, будет заполнен цех, отдел, ну и инвентарный номер который сгенерировался сам.
Дальше при создании User. Я все ввожу, данные которые нужны и выбираю device. и создаю. Поэтому device заполняется user.inventory_number, от этого инвентарного номера в user создается login, который просто копирует этот инвентарный номер, ну и самое ГЛАВНОЕ, чтобы после создания user, получается в таблице device автоматически выбрался тот User, которому соответствует инвентарный номер. Как это реализовать, и как правильно реализовать админку для User?