Настройка модели прокси-сервера

#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 конечно, я отредактирую свой ответ с помощью другой альтернативы.