如何解决代理模型定制
我有相关类型的代理模型。问题是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 %}
如何为此目的正确编辑我的代码?
谢谢。
解决方法
您可以通过以下方式在基本模型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})
当然,这会在基类和子类之间建立一些耦合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。