如何将额外的 URL 值传递给 Django 通用 DeleteView?

Posted

技术标签:

【中文标题】如何将额外的 URL 值传递给 Django 通用 DeleteView?【英文标题】:How do you pass additional URL values to Django generic DeleteView? 【发布时间】:2019-02-28 05:05:23 【问题描述】:

假设我有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)

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

提前致谢!

【问题讨论】:

【参考方案1】:

我们可以在django 中使用get_success_url 来实现它。 默认情况下,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

【讨论】:

以上是关于如何将额外的 URL 值传递给 Django 通用 DeleteView?的主要内容,如果未能解决你的问题,请参考以下文章

Django,如何在提交表单时将 HTML 表单值传递给 URL?

如何将Django中列表的值传递给方法?

使用 Django 和 Jquery 将选择选项值传递给命名的 url 模式

如何将正确的 Url.Action 传递给 JQuery 方法而没有额外的 & 号麻烦?

如何将object_id传递给Django中的通用视图object_detail

如何将一些信息传递给视图而不将其包含在 URL 中(django 新手)