【问题标题】:accessing context data in a class访问类中的上下文数据
【发布时间】: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 等,只需提供不同的模型名称。

标签: python django view


【解决方案1】:

您通过 url 传递的内容可以通过类方法中的 self.request.kwargs 访问。 您应该在您的类方法之一中实现 if 条件,最好是 delete 方法。 也不要忘记在覆盖删除方法时删除对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2013-04-08
    • 2022-01-23
    • 2015-07-29
    • 2023-03-03
    • 1970-01-01
    • 2011-11-30
    • 2023-03-30
    相关资源
    最近更新 更多