Правильный способ использования шаблонов 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')