基于多个泛型类的DetailView's表示相同型号



我正试图使用两个细节视图,它们将在不同的URL上为同一模型呈现不同的模板。同一个模型是否可以有不同的通用局部视图?如果没有,我想我只能自己写了。我所有的细节视图都会路由到absoluteur,但在这种情况下,我希望每个细节视图都路由到我在类中定义的模板。

我使用下面的方法成功地创建了多个列表视图和更新视图,但它对细节视图不起作用,我总是以"course_detail";尽管我宣称";课程细节制作者视图">

型号.py

class Course(models.Model):
class Meta:
verbose_name = "Course"
verbose_name_plural = "Courses"
ordering = ['start_time']
pub_partner_choices = [
("company1", "company1"),
('company2', 'company2'),
]
status_choices = [
('hold', 'Hold'),
('editorial', 'Editorial'),
('approved', 'Approved'),
('cancelled', 'Cancelled'),
]
title = models.CharField(max_length=200)
slug = AutoSlugField(max_length=100, help_text="course title",
populate_from=['title', 'date'], unique=True, )
start_time = models.TimeField(blank=True, null=True)
end_time = models.TimeField(blank=True, null=True)
date = models.DateField(blank=True, null=True)
new_course = models.BooleanField(default=False)
new_instructor = models.BooleanField(default=False)
katacoda = models.BooleanField(default=False)
jupyterhub = models.BooleanField(default=False)
released = models.BooleanField(default=False)
status = models.CharField(max_length=50,
choices=status_choices,
blank=False
)
pub_partner = models.CharField(max_length=50,
choices=pub_partner_choices,
blank=False)
course_notes = models.TextField(max_length=500,
blank=True,
)
producer_notes = models.TextField(max_length=500, blank=True)
id = models.UUIDField(primary_key=True, default=uuid.uuid4,
editable=False
)
producer = models.ManyToManyField(Producer,
related_name="course",
blank=True,
)
def get_absolute_url(self):
"""Return URL to detail page of a Course"""
return reverse(
"course_detail",
kwargs={"slug": self.slug}
)
def __str__(self):
date_time = f"{self.date} {self.start_time}"
return f"{self.title} : {date_time}" 

urls.py

path(
'courses/<str:slug>/',
CourseDetail.as_view(),
name='course_detail'
),
path(
'courses/producer-view/<str:slug>/',
CourseDetailProducerView.as_view(),
name='course_detail_producer_view'
),

views.py

class CourseDetail(LoginRequiredMixin, DetailView):
queryset = Course.objects.all()
template_name = 'lots_app/course_detail.html'

class CourseDetailProducerView(LoginRequiredMixin, DetailView):
queryset = Course.objects.all()
template_name = 'lots_app/course_detail_producer_view.html'

我的问题是由使用reverse_lazy获取absolute_url的UpdateView引起的。事实证明,DetailViews没有问题,只是我试图访问它们的方式(哇!(解决方案是覆盖get_success_url((。现在更正的UpdateView如下所示:

class CourseUpdateProducerView(LoginRequiredMixin, UpdateView):
form_class = CourseFormProducerView
model = Course
template_name = 'lots_app/course_form_producer_view.html'
extra_context = {"update": True}
def get_success_url(self, **kwargs):
"""Return the URL to redirect to after processing a valid form."""
url = reverse_lazy('course_detail_producer_view',
kwargs={"slug": self.object.slug})
return url

最新更新