Python 代理模型定制
我有相关类型的代理模型。问题在于ListView和DetailView连接 课程有所有类型的课程,每个课程必须有相关类型的URL 下面是我的示例代码的完整结构(模型、视图、URL、模板)Python 代理模型定制,python,django,django-models,django-urls,Python,Django,Django Models,Django Urls,我有相关类型的代理模型。问题在于ListView和DetailView连接 课程有所有类型的课程,每个课程必须有相关类型的URL 下面是我的示例代码的完整结构(模型、视图、URL、模板) #models.py 课程类型=( (“开胃菜”), (‘s’、‘汤和沙拉’), (‘m’,‘主菜’), (“d”,“甜点”) ) 课堂课程(models.Model): 类型=模型.CharField(最大长度=1,选项=课程类型) name=models.CharField(最大长度=100) slug=m
#models.py
课程类型=(
(“开胃菜”),
(‘s’、‘汤和沙拉’),
(‘m’,‘主菜’),
(“d”,“甜点”)
)
课堂课程(models.Model):
类型=模型.CharField(最大长度=1,选项=课程类型)
name=models.CharField(最大长度=100)
slug=models.SlugField(blank=True,unique=True)
缩略图=模型.ImageField(null=True,blank=True)
description=models.TextField(最大长度=1000)
def get_绝对_url(自身):
返回反向('course',kwargs={'slug':self.slug})
类开胃菜管理器(models.Manager):
def get_queryset(自我):
返回super(开胃菜管理员,self).get_queryset().filter(
type='a')
类MainManager(models.Manager):
def get_queryset(自我):
返回super(MainManager,self).get_queryset().filter(
type='m')
班级开胃菜(课程):
对象=开胃菜管理器()
类元:
proxy=True
主要课程:
objects=MainManager()
类元:
proxy=True
#views.py
类课程列表视图(列表视图):
模型=课程
模板名称='courses.html'
类开胃菜详细视图(详细视图):
模型=开胃菜
template\u name='apperizer\u detail.html'
类MainDetailView(DetailView):
型号=主
模板名称='main\u detail.html'
#url.py
URL模式=[
路径('courses/',views.CourseListView.as_view(),name='courses'),
路径('appetizer/',views.AppetizerDetailView.as_view(),name='appetizer'),
路径('main/',views.MainDetailView.as_view(),name='main'),
]
#courses.html
课程
{对象列表%中的课程的百分比}
{%endfor%}
我如何才能为此目的正确编辑代码
谢谢。您可以通过以下方式覆盖基础模型
课程
上的获取绝对url
方法:
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})
当然,这会在基类和子类之间产生一些耦合。谢谢你的回答。但对我来说还有很多黑暗的地方。特别是对于视图和模板零件。CourseListView用于列出所有课程,其模型为父类(课程)。如何在父类列表视图中使用代理模型对象传递代理模型详细信息页面。如您所见,courses.html是CourseListView模板,每个对象都为详细页面生成了URL。我的目的是每个代理模型详细页面都应该有URL。实际上,我问这个问题是为了了解如何正确地完成这项工作。提前谢谢。我最初提出的解决方案不起作用,因为courses.html中的所有实例都是courses类型的,我将用其他选项编辑我的答案。
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})