Python 验证django.contrib.comments表单时,如何访问请求对象?
当用户发表django评论时,我想检查一下IP地址 我可以很容易地重写和自定义django.comments使用的表单,但我需要访问请求对象,才能将IP测试添加到其clean()。有没有可能以一种干净的方式访问此文件Python 验证django.contrib.comments表单时,如何访问请求对象?,python,django,comments,Python,Django,Comments,当用户发表django评论时,我想检查一下IP地址 我可以很容易地重写和自定义django.comments使用的表单,但我需要访问请求对象,才能将IP测试添加到其clean()。有没有可能以一种干净的方式访问此文件 另一种方法是在接收保存信号时检查IP,但中止保存的唯一方法似乎是向用户返回代码400 一种可能的方法,但您仍然没有此验证级别中的请求对象 class SomeForm(forms.ModelForm): somefield = forms.CharField(...)
另一种方法是在接收保存信号时检查IP,但中止保存的唯一方法似乎是向用户返回代码400 一种可能的方法,但您仍然没有此验证级别中的请求对象
class SomeForm(forms.ModelForm):
somefield = forms.CharField(...)
def check_somefield(self):
somefield = self.cleaned_data['somefield']
... #do what you want
return somefield
希望这能有所帮助,否则我无法正确理解您的要求。我想这就是您问题的答案:
评论框架提供了一个
评论将被发布的信号:
如果您在这个信号下注册,您的处理程序将被作为参数传递(尚未保存)注释对象和请求。如果处理程序返回False,则post_comment
视图将使用CommentPostBadRequest
进行回答,就像它在任何其他类型的错误(如表单验证失败)上所做的那样。该线程中的首要答案是将请求对象传递给表单。在django.contrib.comments中,您使用模板标记调用表单,就我所知,您无法向其传递其他变量。这将起作用,但是我想将表单返回给用户一条信息性消息,而不是抛出CommentPostBadRequest,该请求将返回一个400错误。@Hobhouse:那么我看到的唯一解决方案就是提供您自己版本的post\u comment
。django/contrib/comments/views/comments.py中的实现似乎没有为您的目的提供任何进一步的挂钩。但是,如果出于安全原因检查IP地址,只回答400状态可能更安全。@Hobhouse:好的,进一步的解决方案可能是提供一个中间件类,该类实现一个process\u request
方法,该方法将当前请求存储在线程局部变量中。这样,您就可以从表单中访问当前请求。看到和