2016-04-14 52 views
0

我想用高清/功能异常值:失踪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”

能否请你帮助我吗?

+3

不应该是'def get_client_ip(self,ip):' –

+1

你的'get_client_ip'不知道'request' – ilse2005

+0

@JacquesGaudin,我做了你告诉我的,并得到了以下结果:“异常值:get_client_ip()缺少2个必需的位置参数:'self'和'ip'“ – Marcos

回答

1

您的代码有多个错误。

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 

但是,这也将无法正常工作,因为requestget_client_ip定义。请求对模型不可见。解决此问题的最简单方法是删除默认设置并将get_client_ip逻辑移至您的视图,并在模型创建时设置ip字段。

+0

能否请你解释一下:“在模型创建时设置ip字段”? – Marcos

0

我不认为你可以传递参数到默认字段。我能想到的实现你想要的最好的方式是覆盖模型的保存功能。

如:

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函数来执行您可能需要的任何清理。

+0

我做了你告诉我和我保存它时得到的:异常值:'联系人'对象没有属性'id' 与此行相关:if not self.id:#first first saving the model。模型def仍然是这样的:def get_client_ip():你能帮我吗? – Marcos

+0

通过'id'我指的是你的模型的主要领域。你是否将任何字段定义为“primary”或“OneToOneField”?使用它来代替'id' – sudshekhar

相关问题