【问题标题】:Exception Value: missing 1 required positional argument异常值:缺少 1 个必需的位置参数
【发布时间】:2016-04-14 14:13:23
【问题描述】:

我想使用 def/function 获取默认值

看一下sn-p代码:

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'

你能帮我解决一下吗?

【问题讨论】:

  • 不应该是def get_client_ip(self, ip):
  • 另外你的get_client_ip 不知道request
  • @JacquesGaudin,我按照你说的做了,得到以下信息:“异常值:get_client_ip() 缺少 2 个必需的位置参数:'self' 和 'ip'”
  • @ilse2005,好的,我该如何解决?

标签: python django django-models


【解决方案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

但这也行不通,因为request 没有在get_client_ip 中定义。请求对模型不可见。解决此问题的最简单方法是删除默认值并将 get_client_ip 逻辑移动到您的视图中,并在模型创建时设置 ip 字段。

【讨论】:

  • 您能否解释一下:“在模型创建时设置 ip 字段”?
【解决方案2】:

我认为您不能将参数传递给默认字段。我能想到的实现您想要的最佳方法是覆盖模型的保存功能。

例如:

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

【讨论】:

  • 我做了你告诉我的事,当我保存它时得到了:异常值:'Contacts' 对象没有属性 'id' 与此行相关:如果不是 self.id:#first time save该模型。模型 def 仍然是这样的: def get_client_ip(): 你能帮我吗?
  • id 我指的是您模型的主要字段。您是否将任何字段定义为primaryOneToOneField?用它代替id
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2017-03-27
  • 2019-11-12
  • 2019-12-23
相关资源
最近更新 更多