如何将其他URL值传递给Django通用DeleteView?

时间:2019-02-28 05:05:24

标签: python django

假设我有models.py:

class Parent(models.Model):
    name = models.CharField(max_length=20)

class child(models.Model):
    name = models.CharField(max_length=20)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

现在在“父母”的“详细信息”视图中,我列出了属于父母的孩子。

这个urls.py看起来像

path('parents/<int:pk>/, views.ParentDetailView.as_view(), name='parent-detail')

我会像这样在我的views.py中使用django DetailView

class ParentDetailView(DetailView):
    model = Parent

现在在此详细信息视图中,我在模板中列出了带有parent_detail.html之类的父对象的子对象

{{parent}}
{% for child in parent.child_set.all %}
    {{ child.name }}
{% endfor %}

但是我希望能够从此页面上的数据库中删除该子级,因此我将添加

{{parent}}
{% for child in parent.child_set.all %}
    {{ child.name }}
    <a href="{% url 'myapp:parent-delete-child" parent.pk child.pk %}">Delete child</a>
{% endfor %}

在这里我被卡住了! 我很想在我的urls.py

中添加类似的内容
path('parents/<int:pk>/', views.ParentDetailView.as_view(), name='parent-detail'),
path('parents/<int:pk>/delete_child/<int:child_pk>/', views.ParentDeleteChildView.as_view(), name='parent-delete-child')

但是我不知道如何将pk和child_pk发送到通用django DeleteView吗?!?!?!

class ParentDeleteChildView(DeleteView):
    model = Child
    success_url = reverse_lazy('myapp:parent-detail' kwargs={'pk':pk})

删除后,我想返回到父详细信息页面。但是成功网址需要知道父级的pk。如何告诉通用视图删除与child_pk匹配的子项,然后转到与pk匹配的父级详细信息页面?我最好不要使用通用的DeleteView吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我们可以使用get_success_url中的django来实现。 默认情况下,pk_url_kwarg设置为kwarg pk。但是在这种情况下,我们必须删除子对象,即child_pk。因此,我们必须通过将pk_url_kwarg覆盖为child_pk来提及它。

class ParentDeleteChildView(DeleteView):
    model = Child
    pk_url_kwarg = 'child_pk'

    def get_success_url(self):
        success_url = reverse_lazy('myapp:parent-detail' kwargs={'pk':self.kwargs['pk']})
        return success_url