gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:58:05 26 4
gpt4 key购买 nike

作为例子,让我们看一下 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 的构造函数中。

例如,对于 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
)
)

关于python - 如何将来自 request.GET 的值作为 django-crispy-forms 中的隐藏输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com