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