#python #django #django-models #django-urls
#python #django #django-модели #django-urls
Вопрос:
У меня есть модели прокси для связанных типов. Проблема заключается в подключении ListView и DetailView.
Курсы имеют все типы курсов, каждый курс должен иметь URL соответствующего типа.
Вот полная структура моего примера кода (модели, представления, URL-адреса, шаблон)
#models.py
COURSE_TYPES = (
('a', 'Appetizer'),
('s', 'Soup and Salad'),
('m', 'Main Course'),
('d', 'Dessert')
)
class Course(models.Model):
type = models.CharField(max_length=1, choices=COURSE_TYPES)
name = models.CharField(max_length=100)
slug = models.SlugField(blank=True, unique=True)
thumbnail = models.ImageField(null=True, blank=True)
description = models.TextField(max_length=1000)
def get_absolute_url(self):
return reverse('course', kwargs={'slug':self.slug})
class AppetizerManager(models.Manager):
def get_queryset(self):
return super(AppetizerManager, self).get_queryset().filter(
type='a')
class MainManager(models.Manager):
def get_queryset(self):
return super(MainManager, self).get_queryset().filter(
type='m')
class Appetizer(Course):
objects = AppetizerManager()
class Meta:
proxy = True
class Main(Course):
objects = MainManager()
class Meta:
proxy = True
#views.py
class CourseListView(ListView):
model = Course
template_name = 'courses.html'
class AppetizerDetailView(DetailView):
model = Appetizer
template_name = 'appetizer_detail.html'
class MainDetailView(DetailView):
model = Main
template_name = 'main_detail.html'
#urls.py
urlpatterns = [
path('courses/', views.CourseListView.as_view(), name='courses'),
path('appetizer/<slug:slug>/', views.AppetizerDetailView.as_view(), name='appetizer'),
path('main/<slug:slug>/', views.MainDetailView.as_view(), name='main'),
]
#courses.html
<h1>Courses</h1>
{% for course in object_list %}
<ul>
<li><a href="{{ course.get_absolute_url }}">{{ course.name }}</a></li>
</ul>
{% endfor %}
Как я могу правильно отредактировать свой код для этой цели?
Спасибо.
Ответ №1:
Вы можете переопределить get_absolute_url
метод в базовой модели Course
таким образом:
class Course(models.Model):
# ...
def get_absolute_url(self):
# this can be more pythonic, using a dictionary perhaps
if self.type == 'a':
viewname = "appetizer"
elif self.type == 'm':
viewname = "main"
# ...
# continue with other proxy models...
# ...
return reverse(viewname, kwargs={'slug':self.slug})
Конечно, это создает некоторую связь между базовым классом и подклассами.
Комментарии:
1. Предложенное мной оригинальное решение не работает, потому что все экземпляры в courses.html конечно, я отредактирую свой ответ с помощью другой альтернативы.