异常值:失踪1人需要的位置参数
我想用高清/功能异常值:失踪1人需要的位置参数
获得默认值以在代码段一看:
models.py
from django.http import HttpRequest
class Contacts(Model):
def get_client_ip(ip):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
ipaddress = CharField(default=get_client_ip, max_length=20, verbose_name='your IP Address')
makemigrations和migrate执行它没有错误或警告。
当我跑了,我得到了以下内容: 异常值:get_client_ip()失踪1个人需要的位置参数:“IP”
能否请你帮助我吗?
您的代码有多个错误。
Value: get_client_ip() missing 1 required positional argument:
这是因为default=get_client_ip
调用不带参数的功能。另外我不明白为什么get_client_ip
需要ip?只是删除,并使用@staticmethod
@staticmethod
def get_client_ip():
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
但是,这也将无法正常工作,因为request
不get_client_ip
定义。请求对模型不可见。解决此问题的最简单方法是删除默认设置并将get_client_ip
逻辑移至您的视图,并在模型创建时设置ip
字段。
能否请你解释一下:“在模型创建时设置ip字段”? – Marcos
我不认为你可以传递参数到默认字段。我能想到的实现你想要的最好的方式是覆盖模型的保存功能。
如:
class Contacts(models.Model):
ipaddress = CharField(max_length=20, verbose_name='your IP Address')
...
def save(self):
if not self.id: #first time saving the model
self.ip = self.get_client_ip(self.ip)
super(Contacts, self).save(*args, **kwargs)
编辑:
对不起只是意识到你解析HTTP头获取字段值。您应该直接从控制器中为您的型号设置此选项,并使用save
函数来执行您可能需要的任何清理。
我做了你告诉我和我保存它时得到的:异常值:'联系人'对象没有属性'id' 与此行相关:if not self.id:#first first saving the model。模型def仍然是这样的:def get_client_ip():你能帮我吗? – Marcos
通过'id'我指的是你的模型的主要领域。你是否将任何字段定义为“primary”或“OneToOneField”?使用它来代替'id' – sudshekhar
不应该是'def get_client_ip(self,ip):' –
你的'get_client_ip'不知道'request' – ilse2005
@JacquesGaudin,我做了你告诉我的,并得到了以下结果:“异常值:get_client_ip()缺少2个必需的位置参数:'self'和'ip'“ – Marcos