Python 验证django.contrib.comments表单时,如何访问请求对象?

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(...)

当用户发表django评论时,我想检查一下IP地址

我可以很容易地重写和自定义django.comments使用的表单,但我需要访问请求对象,才能将IP测试添加到其clean()。有没有可能以一种干净的方式访问此文件


另一种方法是在接收保存信号时检查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
方法,该方法将当前请求存储在线程局部变量中。这样,您就可以从表单中访问当前请求。看到和