如何将额外的 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 和 Jquery 将选择选项值传递给命名的 url 模式
如何将正确的 Url.Action 传递给 JQuery 方法而没有额外的 & 号麻烦?