我想使用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'
你可以帮我吗?
答案 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)
函数执行您可能需要的任何清理。