【问题标题】:Accessing request object from form.save从 form.save 访问请求对象
【发布时间】:2011-01-02 18:01:41
【问题描述】:

我正在使用 Django 的 pyfacebook 模块为我的一个网站实现 facebook Connect,我没有使用本地 User 对象,因为我只想使用 Facebook 登录。

我知道我无法通过 Django 表单的 save 方法访问请求对象,那么我将如何访问提供的中间件提供给您的 facebook 对象?

我想将用户的 facebook UID 附加到从表单创建的对象上,我可以将其作为隐藏字段添加到表单中,但随后人们可以更改它以使其看起来问题来自其他人。

将此 uid 传递给 save() 方法的最佳方法是什么?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    执行此操作的正确方法是使用您尝试保存的对象的实例,如下所示:

    question = Question(user=int(request.facebook.uid))
    form = QuestionForm(request.POST, instance=question)
    question = form.save()
    question.put()
    

    在您的视图中执行此操作,而不是在您的对象的 save() 方法中。

    注意是否需要任何字段,您必须在实例对象中指定它们,否则调用 form.save 将引发异常。

    【讨论】:

      【解决方案2】:

      您可以在创建表单时在表单上设置变量。

      views.py

      def myview(request):
          form = FacebookConnectForm(request)
      

      forms.py

      class FacebookConnectForm(forms.Form):
          def __init__(self, instance):
              self.instance = instance
      
          def save(self):
              print self.instance
              ...
      

      【讨论】:

      • 因为他总是需要表单中的请求,我建议将其作为表单的参数 init 。这样他就必须实例化为:form = FacebookConnectForm(request)
      • 我不认为将请求对象实际传递到表单中是正确的做法,如果我以后需要使用表单来编辑对象怎么办?我不会有要传入的请求对象。
      • 你会在哪里使用这个表格?我从来没有遇到过我的视图之外的表单,所以总是有可用的请求对象。
      • 但是通过让表单感知视图,您在视图和表单之间创建了强耦合,最好将两者分开。如果您将视图与表单耦合,则无论您是否愿意,都必须通过它。
      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2012-07-25
      • 2021-12-25
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多