繁体   English   中英

如何将request.GET中的值作为django-crispy-forms中的隐藏输入

[英]How to put a value from request.GET as a hidden input in django-crispy-forms

例如,让我们看一下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的参数作为隐藏的输入小部件推送到表单中。

我该怎么办?

最后,我自己弄清楚了。

要解决此问题,应将基于原始模板的解决方案中的context_data作为initial forms.Form传递给forms.Form的构造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
    )
  )

您可以要求Django Crispy Form不呈现<form>标记,而仅生成<input>标记,这将使您可以添加自己的额外<input>

您可以通过将表单助手的form_tag属性设置为False

此处详细记录了所有内容 请注意,与示例不同,您不需要{% crispy second_form %} ,只需要在其中添加自己的if块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM