[英]TypeError at /crear-cliente/ in Django
你好,我正在嘗試做一個可以存儲客戶記錄的表格,但最近它拋出了這個錯誤
TypeError at /crear-cliente/
object of type 'int' has no len()
C:\Users\G-FIVE\Desktop\practicas y proyectos\mini_erp\MiniErp\customers\views.py
,第 43 行,在 register_customer 中
address = address
)
customer.save()
"""
form = FormCustomer(request.POST)
if form.is_valid():
……
data_form = form.cleaned_data
first_name = data_form['first_name']
last_name = data_form['last_name']
cedula = data_form['cedula']
phone_number = data_form['phone_number']
我使用 Django 類制作了表單,我將向您展示表單代碼、視圖和 model
表單代碼:
from django import forms
from django.core import validators
# Clase para el formulario de registro de clientes
class FormCustomer(forms.Form):
# Input para el first_name
first_name = forms.CharField(
label='Nombre',
required=True,
widget=forms.TextInput(
attrs={
'placeholder':'Ej: John',
'class': 'form-control form-control-user mb-3',
'id': 'first_name'
}
),
validators= [
validators.MinLengthValidator(3, 'El nombre está incompleto')
]
)
# Input para el last_name
last_name = forms.CharField(
label='Apellido',
required=True,
widget=forms.TextInput(
attrs={
'placeholder':'Ej: Doe',
'class': 'form-control form-control-user mb-3',
'id': 'last_name'
}
),
validators= [
validators.MinLengthValidator(3, 'El nombre está incompleto')
]
)
# Input para la cédula
cedula = forms.IntegerField(
label='Cédula',
required=True,
widget=forms.NumberInput(
attrs={
'placeholder':'xx xxx xxx',
'class': 'form-control form-control-user mb-3',
'id': 'cedula'
}
),
validators= [
validators.MinLengthValidator(7, 'Faltan números'),
validators.MaxLengthValidator(8, 'Has introducido más números')
]
)
# Input para el teléfono
phone_number = forms.IntegerField(
label='Teléfono',
required=True,
widget=forms.NumberInput(
attrs={
'placeholder':'04xx xxx xx xx',
'class': 'form-control form-control-user mb-3',
'id': 'phone_number'
}
),
validators= [
validators.MinLengthValidator(11, 'Faltan números'),
validators.MaxLengthValidator(11, 'Has introducido más números')
]
)
# Input para la dirección
address = forms.CharField(
label='Dirección',
widget=forms.Textarea(
attrs={
'class': 'form-control form-control-user mb-3',
'style': 'min-height: 150px; max-height: 150px;',
'id': 'address'
}
)
)
查看代碼:
# Vista que se encarga de registrar al cliente (C)
def register_customer(request):
if request.method == 'POST':
form = FormCustomer(request.POST)
if form.is_valid():
data_form = form.cleaned_data
first_name = data_form['first_name']
last_name = data_form['last_name']
cedula = data_form['cedula']
phone_number = data_form['phone_number']
address = data_form['address']
customer = Customer(
first_name = first_name,
last_name = last_name,
cedula = cedula,
phone_number = phone_number,
address = address
)
customer.save()
return redirect('home')
elif request.method == 'GET':
return redirect('create_customer')
Model 代碼:
# Clase para la tabla Cliente
class Customer(models.Model):
first_name = models.CharField(max_length=100, verbose_name='Nombre(s)')
last_name = models.CharField(max_length=100, verbose_name='Apellido(s)')
cedula = models.IntegerField(max_length=8, verbose_name='Cédula')
phone_number = models.IntegerField(max_length=11, verbose_name="Teléfono")
address = models.TextField(verbose_name='Dirección')
created_at = models.DateTimeField(auto_now_add=True, verbose_name="Creado el")
updated_at = models.DateTimeField(auto_now=True, verbose_name="Actualizado el")
class Meta:
verbose_name = 'Cliente'
verbose_name_plural = 'Clientes'
ordering = ['-created_at']
def __str__(self):
return self.first_name
我希望有人能給我一點幫助
我試圖尋找示例並且看到了與我的代碼類似的代碼
您在 IntegerFields 上使用MinLengthValidator
和MaxLengthValidator
,它嘗試在整數上使用len()
function。 這是不可能的。 因此,您的cedula
和phone_number
字段將產生object of type 'int' has no len()
錯誤。 您可以考慮將MaxValueValidator
和MinValueValidator
與integer
用於驗證器,而不是MinLengthValidator
和MaxLengthValidator
,或者將字段更改為CharField
。
我不確定cedula
是什么,但我建議將phone_number
設為字符串。 電話號碼不被視為整數,可以包含特殊字符,例如添加區號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.