【问题标题】:Django: Passing variable from get_context_data() to post()Django:将变量从 get_context_data() 传递到 post()
【发布时间】:2015-01-21 17:12:08
【问题描述】:

该变量在get_context_view() 中定义,因为它需要id 才能访问正确的数据库对象:

class FooView(TemplateView):
  def get_context_data(self, id, **kwargs):
    ---
    bar = Bar.objects.get(id=id)
    ---

  def post(self, request, id, *args, **kwargs):
    # how to access bar?
    # should one call Bar.objects.get(id=id) again?

bar 变量传递给post() 的方法是什么?

尝试将其保存为 FooView 的字段并通过self.bar 访问它,但这并没有成功。 self.bar 没有被post() 看到

【问题讨论】:

    标签: python django


    【解决方案1】:

    我知道为时已晚,但几天前我遇到了同样的问题。但是,这是我的解决方案。

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['foos'] = self.object.filter()
        return context
    
    def post(self, request, *args, **kwargs):
        context = super().post(request, *args, **kwargs)
        foos = self.get_context_data().get('foos')
        # do stuff here
        return context
    

    【讨论】:

      【解决方案2】:

      你应该把它倒过来。如果你在post() 中需要bar,你需要在那里创建它:

      class FooView(TemplateView):
          def get_context_data(self, **kwargs):
              bar = self.bar
      
          def post(self, request, id, *args, **kwargs):
              self.bar = Bar.objects.get(id=id)
              ...
      

      post()get_context_data 之前被调用,这就是为什么如果你在get_context_data 中定义它,post 看不到它。

      【讨论】:

      • 这是有道理的。你知道什么函数在 post() 之前运行并且可以访问传递的变量(例如id)吗?
      • 也许您可以分享一个链接 - 功能(发布、获取等)执行的顺序。我已经花了一些时间挖掘但没有成功。
      • 您的解决方案导致 Exception Value: 'FooView' object has no attribute 'bar'
      • @h3d0 那么你可能有一个get 方法没有设置bar。请改用dispatch,这将为每个请求方法设置它。它总是从.as_view() 开始,调用disptach 时使用的参数与基于函数的视图所期望的参数相同。从那里您可以使用源代码来跟踪方法流。我经常用Classy Class-based views作为参考,很有用。
      【解决方案3】:

      正如 knbk 所说,我的解决方案是 dispatch 方法,在那里我定义了我将在 get_context_data 和 post 方法中使用的变量,这对我来说是一种共享数据的方式 这是我的例子

      def dispatch(self, request, *args, **kwargs):
      
          self.some_data = '123'
          if request.method.lower() in self.http_method_names:
              handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
          else:
              handler = self.http_method_not_allowed
          return handler(request, *args, **kwargs)
      
      def get_context_data(self, **kwargs):
          context = super(MyTestCreateView, self).get_context_data(**kwargs)
          print('test get_context_data', self.some_data)
      
      def post(self, request, *args, **kwargs):        
          print('test post', self.some_data)
          return super().post(request, *args, **kwargs)
      

      Classy CBV 希望对你有帮助

      【讨论】:

        【解决方案4】:

        如果变量是在你的 CBV(基于类的视图)中定义的,它可以直接在你的模板中调用。

        Views.py

        class SomeRandomView(FormView):
            username = 'SomeValue'
        

        模板.html

        <p>Username is {{view.username}}<p>
        

        旁注:如果我没记错的话,您甚至可以直接在 Django 1.5 版之后的模板文件中调用视图类中的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          • 2019-07-24
          • 2021-09-13
          • 2013-12-16
          • 1970-01-01
          • 2012-02-15
          相关资源
          最近更新 更多