例外值:缺少1个必需的位置参数

时间:2016-04-14 14:13:23

标签: python django django-models

我想使用def / function

获取默认值

查看代码段:

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'

你可以帮我吗?

2 个答案:

答案 0 :(得分: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字段。

答案 1 :(得分:0)

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

例如:

curl -X GET \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -G \
  --data-urlencode 'where={"playerName":"Sean Plott","cheatMode":false}' \
  https://api.parse.com/1/classes/GameScore

修改

很抱歉只是意识到您正在解析HTTP标头以获取字段值。您应该直接从控制器为您的模型设置此项,并使用 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) 函数执行您可能需要的任何清理。