【问题标题】:Pass request to model form using generic view in Django使用 Django 中的通用视图将请求传递给模型表单
【发布时间】:2010-07-11 19:12:10
【问题描述】:

我使用 Django 和通用视图“django.views.generic.create_update.create_object” 我有一个模型表单,我将其传递给通用视图:

url(r'^add$', create_object, {'template_name':'tpl.html','form_class':MyModelForm,'post_save_redirect':'/'},name = 'add'),

我需要在我的 ModelForm.save 方法中获取当前用户.. 但是我找不到方法,请帮我找到方便的方法?

class MyModelForm(forms.ModelForm):

class Meta:
    model = MyModel


def save(self,*a,**b):
    MyModel.save(user=request.user) #how can i get here request.user?

通常的问题是 - 我如何访问传递给通用视图的表单中的请求参数。

【问题讨论】:

  • 嗯,我也很好奇这个。您介意编写自己的通用处理程序,还是必须使用标准处理程序并使其在这里工作?前者我做过,但后者还没有......
  • 最好我想使用通用视图。我看到一种使用中间件的解决方案,例如将 request.user 直接附加到 MyModelForm,但我也有问题(MyModelForm 实例从导入更改为导入..我不知道为什么,但我在保存方法中有不同的类对象实例和我的中间件功能,我在保存时丢失了附加的参数)。其他方式我认为它可以在 apply_extra_context 中完成,它可以使用类似 context[key] = value(request) 的东西,但它只使用 context[key] = value() ...

标签: python django forms


【解决方案1】:

你可能会破解一些东西来将请求注入到表单实例中,但你为什么要打扰呢?通用视图仅作为基本要求的快速简便的解决方案。一旦您开始需要大规模定制,您不妨自己编写实际视图。毕竟,这不是很多代码。

【讨论】:

    【解决方案2】:

    看那个:

    url(r'^add$', create_object_with_request, {'template_name':'tpl.html','form_class':MyModelForm,'post_save_redirect':'/'},name = 'add'),
    

    ,

    def create_object_with_request(request, *args, **kwargs):
        def inject_request(fun):
            def helper(*args, **kwargs):
                return fun(*args, request=request, **kwargs)
            return helper
        kwargs['form_class'] = inject_request(kwargs['form_class'])
        return create_object(request, *args, **kwargs)
    

    所以你已经将请求传递给你的类构造函数。或者您可以将其添加为属性:

    def create_object_with_request(request, *args, **kwargs):
        def inject_request(fun):
            def helper(*args, **kwargs):
                res = fun(*args, **kwargs)
                res.request = request
                return res
            return helper
        kwargs['form_class'] = inject_request(kwargs['form_class'])
        return create_object(request, *args, **kwargs)
    

    【讨论】:

      【解决方案3】:

      thnx 这有帮助)我在这个语法和 _meta attr 上有一些问题,我完成了这个

      def create_object_with_request(request, *args, **kwargs):

      def inject_request(fun):
      
          def helper(*args, **kwargs):
              finst = fun(*args, **kwargs)
              finst.request = request
              return finst
      
          helper._meta = fun._meta
          return helper
      kwargs['form_class'] = inject_request(kwargs['form_class'])
      return create_object(request,*args, **kwargs)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多