【问题标题】:Multiple generic class based DetailView's for the SAME modelSAME 模型的多个基于泛型类的 DetailView
【发布时间】:2020-10-31 18:37:21
【问题描述】:

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

我使用下面的方法成功地创建了多个列表视图和更新视图,但是它在详细视图上不起作用,即使我声明了“course_detail_producer_view”,我总是以“course_detail”结束。

models.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'

【问题讨论】:

    标签: django django-models django-class-based-views


    【解决方案1】:

    我的问题是由使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2020-05-19
      • 2020-07-04
      • 2021-03-26
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多