django - int 参数必须是字符串或数字,而不是“元组”
Posted
技术标签:
【中文标题】django - int 参数必须是字符串或数字,而不是“元组”【英文标题】:django - int argument must be a string or a number, not 'Tuple' 【发布时间】:2012-08-01 14:42:33 【问题描述】:我已经看了几个小时,但我似乎无法理解为什么我会收到此消息...
int() argument must be a string or a number, not 'tuple'
在我的 views.py 的这一行上(注意:异常实际上发生在 django 核心的更深处,但这是我的代码行最终触发了异常)...
service_interest = ServiceInterest.objects.get_or_create(service = service, client = client)
为什么会出现此错误?为了您的利益,请参阅下面的 models.py、forms.py 和 views.py 中的 sn-p。
models.py:
class Client(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
site = models.URLField()
contact_date = models.DateField(default = datetime.date.today())
class Service(models.Model):
name = models.CharField(max_length=200)
class ServiceInterest(models.Model):
service = models.ForeignKey('Service')
client = models.ForeignKey('Client')
class Meta:
unique_together = ("service", "client")
forms.py...
class ContactForm(forms.Form):
SERVICE_CHOICES = (
('first_choice', 'Description of first choice'),
('second_choice', 'Description of second choice'),
('third_choice', 'Description of third choice'),
('other', 'Other')
)
SERVICE_CHOICES_DICT = dict(SERVICE_CHOICES)
name = forms.CharField(label='What would you like us to call you?', max_length=200, required=False)
email = forms.EmailField(label='What is your email address?', help_text='Ex: yourname@gmail.com')
url = forms.URLField(label='If you have a website, please provide a link', required=False, help_text="Ex: www.yoursite.com")
service_interest = forms.MultipleChoiceField(label="Please check all of the services you're interested in:", widget=forms.widgets.CheckboxSelectMultiple, choices=SERVICE_CHOICES, required=True)
other = forms.CharField(label='If you selected \"Other\", please specify:', max_length=200, required=False)
message = forms.CharField(max_length=10000, required=False, label='Any other information you think we should know?', widget=forms.widgets.Textarea)
def clean_other(self):
cleaned_data = super(ContactForm, self).clean()
if 'service_interest' in cleaned_data.keys():
options = cleaned_data['service_interest']
if 'other' in options:
other_input = cleaned_data['other']
if other_input == None or len(other_input) == 0:
raise forms.ValidationError('Required when \"Other\" is checked')
return cleaned_data
views.py 中的相关代码:
name = form.cleaned_data['name']
email = form.cleaned_data['email']
url = form.cleaned_data['url']
interests = form.cleaned_data['service_interest']
other = form.cleaned_data['other']
message = form.cleaned_data['message']
client = Client.objects.get_or_create(name = name, email = email, site = url)
for interest in interests:
service = None
if(interest != 'other'):
service = Service.objects.get_or_create(name = ContactForm.SERVICE_CHOICES_DICT[interest])
else:
service = Service.objects.get_or_create(name = other)
# Appears to be responsible for the stack trace, even though exception
# is one level deeper in...
# /Library/Python/2.7/site-packages/django/core/handlers/base.py in get_response
service_interest = ServiceInterest.objects.get_or_create(service = service, client = client)
【问题讨论】:
如果我不得不猜测,我会说这是因为传递给 int() 的是一个元组,而不是字符串或数字。 【参考方案1】:get_or_create
返回一个元组,格式为(instance, created)
。第二个参数告诉你它是否必须创建它,很明显。请改为执行以下操作:
client, created = Client.objects.get_or_create(name = name, email = email, site = url)
【讨论】:
很奇怪。我原以为如果你说client = ...
,而不是client, created = ...
,那么(元组的)第二个“返回值”就会丢失。再说一次,我是 Python 的菜鸟 :)
不行,因为返回值是一个元组,所以整个元组都存放在变量中。逗号分隔的变量名列表有点神奇,它告诉 Python 解析器扩展返回值(假设是一个元组)并将值存储在各自的变量中。以上是关于django - int 参数必须是字符串或数字,而不是“元组”的主要内容,如果未能解决你的问题,请参考以下文章
Django 保存到 DB:TypeError:int() 参数必须是字符串、类似字节的对象或数字,而不是“元组”
TypeError:int() 参数必须是字符串或数字,而不是 'datetime.datetime'
TypeError:int() 参数必须是字符串、类似字节的对象或数字,而不是“DataFrame”