Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 如何在型号'中访问远程地址;s save()方法_Python_Django_Django Models - Fatal编程技术网

Python 如何在型号'中访问远程地址;s save()方法

Python 如何在型号'中访问远程地址;s save()方法,python,django,django-models,Python,Django,Django Models,我有一个模型(UserProfile),我想在创建新用户帐户时用它记录用户的IP地址 我已经开始重写Django模型的save()方法,但我完全不确定如何从模型中正确访问HttpRequest属性。你们谁能帮忙?谷歌无法为我提供一个具体的答案。你可以从中获得请求,但你不能用普通代码。如果需要,则必须在视图中手动分配它。始终需要将请求信息从视图传递到保存方法。 考虑到保存一个实例并不总是必须从HTTP请求中调用(对于一个简单的例子,在Python shell中调用保存< /代码>)。 如果在保存时

我有一个模型(UserProfile),我想在创建新用户帐户时用它记录用户的IP地址


我已经开始重写Django模型的save()方法,但我完全不确定如何从模型中正确访问HttpRequest属性。你们谁能帮忙?谷歌无法为我提供一个具体的答案。

你可以从中获得请求,但你不能用普通代码。如果需要,则必须在视图中手动分配它。

始终需要将请求信息从视图传递到保存方法。 考虑到保存一个实例并不总是必须从HTTP请求中调用(对于一个简单的例子,在Python shell中调用<代码>保存< /代码>)。 如果在保存时需要访问管理中的
请求
对象,可以覆盖它的
保存\u model
方法:

def save_model(self, request, obj, form, change):
    # do something with obj and request here....
    obj.save()
但除此之外,您必须始终从视图中传递它:

def my_view(request):
    obj = MyClass(ip_address = request.META['REMOTE_ADDR'])
或者,为了便于重复使用,在模型上创建一个方法,如:

def foo(self, request):
    self.ip_address = request.META['REMOTE_ADDR']
    self..... = request.....

然后用
obj.foo(request)

从您的视图中调用它,真的吗?无法从模型的save()方法中声明self.ip_address=request.META['REMOTE_ADDR']?除了显式发送请求外,无法从其他任何地方访问请求。@tommytwoeyes不,模型甚至对HTTP本身都是不可知的,因此“请求”的概念对它们来说没有任何意义。分离关注点!好吧,这是可以理解的。然而,如果我只能从视图中设置UserProfile的ip_address属性,那么这是否会导致视图和模型的耦合过于紧密?如果我需要从其他地方修改UserProfile的ip_地址,并重复我的代码,这不是有点不符合pythonic吗?我不想听起来有争议——我只是对Python和Django非常陌生,我正试图了解实现这一点的最佳方法。谢谢如果你想把他们结合在一起,那是你的特权。但也不要让Django去做,谢谢。我想我会把它放在注册视图中。将它放在admin save_model()方法中是行不通的,因为如果我在我们的一个站点管理员通过admin创建用户帐户时记录了REMOTE_ADDR值,它将记录她的IP地址,而不是用户的IP地址。