【发布时间】:2021-05-17 12:20:32
【问题描述】:
我想对不同的情况使用 DeleteView,而不是为每种情况重写一个新函数。所以我想我将模型作为 URL 中的参数传递,然后通过覆盖 get_context_data 函数来选择要使用的删除。我的问题是如何访问上下文变量:
views.py:
class PDelete(DeleteView):
template_name='kammem/delete.html'
if context['model']=='Person':
model=Person
success_url=reverse_lazy('personer')
elif context['model']=='Concert':
model=Concert
success_url=reverse_lazy('concert')
def get_context_data(self,**kwargs):
context=super().get_context_data(**kwargs)
context['model']=self.kwargs['model']
return context
urls.py
path('pdelete/<int:pk>/<str:model>',PDelete.as_view(),name='pdelete'),
问题是上下文变量在类中未定义。有什么建议吗?
【问题讨论】:
-
拥有多个视图有什么问题?此外,您可以在每个模型的 url 中简单地写
DeleteView.as_view(model=Person, success_url=reverse_lazy('concert'))之类的东西,而不是这样做(如果您也想减少它,您可以执行一些列表理解) -
您还需要在
DeleteView.as_view(model=Person, success_url=reverse_lazy('concert'), template_name='kammem/delete.html')上方传递template_name -
很好,你能像这样访问模型参数吗:path('pdelete/
/ ',DeleteView.as_view(model=model,success_url=reverse_lazy( '音乐会'), template_name='kammem/delete.html')) ? -
不,你为什么要这样?捕获的任何模式都会传递给视图。所以你需要覆盖视图的一些方法。我相信像
[path(..., DeleteView.as_view(model=model, ...), ...) for model in model_list]这样的东西应该是你想要的,但我不同意以这种方式做事。您应该显式地编写每个 url(为什么要让自己和其他阅读代码的人感到困惑?)。 -
好吧,我想我明白了,我的基本想法是为什么要复制大量代码,而唯一的区别在于模型名称?但是好的,我可以创建多个路径条目,例如 pdelete、cdelete 等,只需提供不同的模型名称。