Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django内部';s models.py,如果我正在验证表单,如何获取用户';s IP?_Python_Django_Validation_Forms_Ip - Fatal编程技术网

Python Django内部';s models.py,如果我正在验证表单,如何获取用户';s IP?

Python Django内部';s models.py,如果我正在验证表单,如何获取用户';s IP?,python,django,validation,forms,ip,Python,Django,Validation,Forms,Ip,我知道如何在视图中获取它。py request.META['REMOTE\u ADDR'] 但是,当验证我的一个表单时,如何在models.py中获取它?如果在表单级别或模型级别进行验证,则这两个实例对HTTP请求(存储客户端IP信息的位置)一无所知 我可以想出两个选择: 在视图级别进行验证,在该级别可以将错误插入表单错误列表 您可以将用户IP(可能已加密)放在表单的隐藏字段中 您可以将请求对象传递给正在调用的表单/模型代码:这将提供对request.META['REMOTE\u ADDR']

我知道如何在视图中获取它。py

request.META['REMOTE\u ADDR']


但是,当验证我的一个表单时,如何在models.py中获取它?

如果在表单级别或模型级别进行验证,则这两个实例对HTTP请求(存储客户端IP信息的位置)一无所知

我可以想出两个选择:

  • 在视图级别进行验证,在该级别可以将错误插入表单错误列表
  • 您可以将用户IP(可能已加密)放在表单的隐藏字段中

您可以将请求对象传递给正在调用的表单/模型代码:这将提供对
request.META['REMOTE\u ADDR']
的访问。或者,把它传过来。

用一种可能的方式,但我不确定它是不是最好的

定义自己的清洁方法

class someForm(forms.Form):
    afield = CharField()

    def clean(self, **kwargs):
        cleaned_data = self.cleaned_data
        afield = cleaned_data.get('afield')
        if 'ip' in kwargs:
            ip = kwargs['ip']
            # ip check block, you migth use your cleaned data in here
        return cleaned_data


some_info = {'afield':123} #you will wish to use post or gt form data instead, but tihs iis for example
form = someForm(some_info) 
if form.is_valid():
    data = form.clean({'ip':request.META['REMOTE_ADDR']}) # you pass a dict with kwargs, which wwill be used in custom clean method

需要加密吗?@TIMEX:只有在你关心伪造的情况下。这不是很好的设计,因为它在某种程度上打破了隔离:视图不应该关心表单内部。