TypeError в /crear-cliente/ в 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, я покажу вам код формы, представления и модели
Код формы:
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')
Код модели:
# 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
Мне бы хотелось, чтобы кто-нибудь мог мне немного помочь
Я пытался искать примеры и видел код, похожий на мой
Вы используете MinLengthValidator
и MaxLengthValidator
на IntegerFields, который пытается использовать функцию len()
на целых числах. Это невозможно. Поэтому ваши поля cedula
и phone_number
будут выдавать ошибку object of type 'int' has no len()
. Вы можете либо рассмотреть возможность использования MaxValueValidator
и MinValueValidator
с integer
для валидаторов вместо MinLengthValidator
и MaxLengthValidator
, либо изменить поля на CharField
.
Я не уверен, что такое cedula
, но я бы рекомендовал сделать phone_number
строкой. Телефонные номера не считаются целыми числами и могут содержать специальные символы, например, добавление кода города.