gpt4 book ai didi

python - 验证 get 请求中的表单,如何?

转载 作者:行者123 更新时间:2023-11-30 23:46:26 24 4
gpt4 key购买 nike

以我的完美主义方式,我来这里是为了提出更多关于没有很好记录的基于类(Class)的观点的问题。

我花了大约 5 个小时学习基于类的 View ,潜伏在代码中,然后我得到了一个问题。

也许我想做的事情很愚蠢,如果是这样,就直说吧。

我举一个简单的例子:

class SearchFormView(FormView):
template_name = 'search/search.html'
form_class = SearchForm

def get(self, request, *args, **kwargs):
form = SearchForm(self.request.GET or None)
if form.is_valid():
self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10]

return super(SearchFormView, self).get(request, *args, **kwargs)

这是一个完美的有效类(确实如此,对吧?)。

您有一个表单,并且使用查询参数发出 GET 请求。

就像魅力一样。

但是让我们想象一下...我验证查询输入以防止某种类型的攻击,并且我发现该查询是恶意的,因此我输入了验证错误。

使用旧函数,我有一个表单实例(空),我将数据放入其中,并在需要时验证错误。如果为空(第一个请求)或充满错误(恶意查询的情况),我总是返回该实例。

问题出在基于类的 View 上。在我的 get 方法中,我使用 SearchForm 的额外实例,因此如果我放置验证内容,那么如果我在 father 上调用 get它将使用“form_class”上的空实例。

所以,我认为应该有一种方法让我始终使用相同的表单,我的意思是:我调用请求方法,我选择form_class(而不是创建新表单),传递数据,验证和父亲将返回带有验证内容的表单。

我不确定我的解释是否正确。简而言之,我在 get 中创建了表单的副本,但我返回了 父亲 get,他有另一个空的副本,所以当我显示模板时,不会出现错误,因为发送的表格是空的。

有什么想法吗?谢谢。

最佳答案

您的问题是 super(SearchFormView, self).get(request, *args, **kwargs) 呈现自己的表单和自己的上下文。它只是一个 3 行 View 函数,因此您确实应该重写更改其行为所需的内容。

   def get(self, request, *args, **kwargs):
form = SearchForm(self.request.GET or None)
if form.is_valid():
self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10]

return self.render_to_response(self.get_context_data(form=form))
<小时/>

更新:如果您想继续使用 super 调用,请采用替代想法

def get(self, request, *args, **kwargs):
self.form = SearchForm(self.request.GET or None)
if self.form.is_valid():
self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10]

return super(SearchFormView, self).get(request, *args, **kwargs)


def get_form(self, form_class):
"""
Returns an instance of the form to be used in this view.
"""
return getattr(self, 'form', None) or form_class(**self.get_form_kwargs())

关于python - 验证 get 请求中的表单,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915020/

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