簡體   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