【问题标题】:How to put a value from request.GET as a hidden input in django-crispy-forms如何将 request.GET 中的值作为隐藏输入放入 django-crispy-forms
【发布时间】:2013-09-29 10:29:01
【问题描述】:

作为一个例子,我们来看看 django.contrib.auth 中的 'next' 参数

如果客户端试图访问一些仅对经过身份验证的用户可用的资源,登录 url 将被修改并附加额外的参数为 ?next=the_next_url 。然后,LoginForm 可以将此参数设置为context_data,并生成一个带有隐藏输入的表单,其中包含其值,如

{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}

但是,如果我完全使用 django-crispy-form 生成表单,我该怎么做?在这种情况下,模板文件只包含

{% crispy_tag form %}

form 将被设置为上下文数据,这意味着我必须将来自 request.GET 的参数作为隐藏的输入小部件推送到表单中。

我该怎么做?

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    最后,我自己想通了。

    为了解决这个问题,原基于模板的解决方案中的 context_data 应该作为initial 传递给forms.Form 的构造函数。

    例如,对于 django CVB,get_initial 是将初始数据传递给表单的正确点

    def get_initial(self):
      initial = Super(ThisCBV, self).get_initial()
      redirect_field_name = self.get_redirect_field_name()
      if (redirect_field_name in self.request.GET and 
          redirect_field_value in self.request.GET):
          initial.update({
               "redirect_field_name": redirect_field_name,
               "redirect_field_value": self.request.REQUEST.get(
                   redirect_field_name),
          })
      return initial
    

    那么就可以在forms.Form的实例中动态添加一个字段

    def __init__(self, *args, **kwargs):
      super(ThisForm, self).__init__(*args, **kwargs)
      if ('redirect_field_name' in kwargs['initial'] and
          'redirect_field_value' in kwargs['initial']):
    
          self.has_redirection = True
          self.redirect_field_name = kwargs['initial'].get('redirect_field_name')
          self.redirect_field_value = kwargs['initial'].get('redirect_field_value')
    
          ## dynamically add a field into form
          hidden_field = forms.CharField(widget=forms.HiddenInput())
          self.fields.update({
            self.redirect_field_name: hidden_field
          })
    
      ## show this field in layout
      self.helper = FormHelper()
      self.helper.layout = Layout(
        Field(
          self.redirect_field_name,
          type='hidden',
          value=self.redirect_field_value
        )
      )
    

    【讨论】:

      【解决方案2】:

      您可以要求 Django Crispy Form 不渲染 &lt;form&gt; 标签,而只生成 &lt;input&gt; 标签,这样您就可以添加自己的额外 &lt;input&gt;。

      您可以通过将表单助手的 form_tag 属性设置为 False 来做到这一点。

      这都是documented in detail here。请注意,与示例不同的是,您不需要{% crispy second_form %},只需在此处添加自己的if 块。

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 2012-04-24
        • 2018-07-16
        • 1970-01-01
        • 2020-01-21
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 2022-11-28
        相关资源
        最近更新 更多