簡體   English   中英

異常值:缺少1個必需的位置參數

[英]Exception Value: missing 1 required positional argument

我想使用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和migration在沒有錯誤或警告的情況下執行了它。

當我運行時,我得到以下信息:異常值: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

但這也不起作用,因為沒有在get_client_ip定義request 請求對模型不可見。 解決此問題的最簡單方法是刪除默認值,並將get_client_ip邏輯移至視圖,並在模型創建時設置ip字段。

我認為您不能將參數傳遞給默認字段。 我可以想到的最好的方法是重寫模型的保存功能。

例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM