Правильный способ использования шаблонов URL, представлений и шаблонов при использовании базовых классов Django Abstract для моих моделей

Есть ли лучшие подходы к решению этой проблемы? Эта модельная структура - то, что я хочу получить для своей базы данных. Поэтому я чувствую, что нарушаю правило DRY с моим учебным проектом.

Используем Django 3.2.9 и Python 3.9.6

Я искал в интернете, как сделать это более динамичным в представлениях, url & шаблонах, но мне не повезло.

У меня есть следующая структура модели для моего models/contact.py

class BaseContact(AbstractUser):
    other_name = models.CharField(max_length=50, null=True, blank=True)
    contact_number = models.CharField(max_length=10, null=True, blank=True)
    email = models.EmailField(unique=True)
    postal_address = models.ForeignKey(location.Address, on_delete=models.CASCADE, null=True, blank=True)
    tax_id = models.CharField(max_length=11, null=True, blank=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name']

    class Meta:
        default_related_name = 'base'
        verbose_name = 'Contact'
        verbose_name_plural = 'Contacts'

    def get_absolute_url(self):
        return reverse("%s:detail-%s" % (str(type(self).__name__.lower()), str(type(self).__name__.lower())),
                       kwargs={"pk": self.pk})


class Customer(BaseContact):

    class Meta:
        default_related_name = 'customer'


class Supplier(BaseContact):
    class Meta:
        default_related_name = 'supplier'


class Employee(BaseContact):
    class Meta:
        default_related_name = 'employee'
        verbose_name = 'Employee'
        verbose_name_plural = 'Employees'

Итак, мой urls/contact.py выглядит мрачно.

from django.urls import path
from main.views.contact import UpdateEmployeeView, DetailEmployeeView, CreateEmployeeView, DeleteEmployeeView
from main.views.contact import UpdateSupplierView, DetailSupplierView, CreateSupplierView, DeleteSupplierView
from main.views.contact import UpdateCustomerView, DetailCustomerView, CreateCustomerView, DeleteCustomerView

urlpatterns = [
    path('employee/create/', CreateEmployeeView.as_view(), name='create-employee'),
    path('employee/detail/<int:pk>', DetailEmployeeView.as_view(), name='detail-employee'),
    path('employee/update/<int:pk>', UpdateEmployeeView.as_view(), name='update-employee'),
    path('employee/delete/<int:pk>', DeleteEmployeeView.as_view(), name='delete-employee'),

    path('supplier/create/', CreateSupplierView.as_view(), name='create-supplier'),
    path('supplier/detail/<int:pk>', DetailSupplierView.as_view(), name='detail-supplier'),
    path('supplier/update/<int:pk>', UpdateSupplierView.as_view(), name='update-supplier'),
    path('supplier/delete/<int:pk>', DeleteSupplierView.as_view(), name='delete-supplier'),

    path('customer/create/', CreateCustomerView.as_view(), name='create-customer'),
    path('customer/detail/<int:pk>', DetailCustomerView.as_view(), name='detail-customer'),
    path('customer/update/<int:pk>', UpdateCustomerView.as_view(), name='update-customer'),
    path('customer/delete/<int:pk>', DeleteCustomerView.as_view(), name='delete-customer'),
]

не намного лучше в views/contact.py

class CreateEmployeeView(CreateView):
    model = Employee
    template_name_suffix = '_create_form'
    fields = ['__all__']


class DetailEmployeeView(DetailView):
    model = Employee


class UpdateEmployeeView(UpdateView):
    model = Employee
    form_class = UpdateEmployeeForm
    template_name_suffix = '_update_form'


class DeleteEmployeeView(DeleteView):
    model = Employee
    success_url = reverse_lazy('home')


class CreateSupplierView(CreateView):
    model = Supplier
    template_name_suffix = '_create_form'
    fields = ['__all__']


class DetailSupplierView(DetailView):
    model = Supplier


class UpdateSupplierView(UpdateView):
    model = Supplier
    form_class = UpdateSupplierForm
    template_name_suffix = '_update_form'


class DeleteSupplierView(DeleteView):
    model = Supplier
    success_url = reverse_lazy('home')


class CreateCustomerView(CreateView):
    model = Customer
    template_name_suffix = '_create_form'
    fields = ['__all__']


class DetailCustomerView(DetailView):
    model = Customer


class UpdateCustomerView(UpdateView):
    model = Customer
    form_class = UpdateCustomerForm
    template_name_suffix = '_update_form'


class DeleteCustomerView(DeleteView):
    model = Customer
    success_url = reverse_lazy('home')

папка templates/main

Вернуться на верх