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

  1.             address = address
    
  2.         )
    
  3. 
    
  4.         customer.save()
    
  5.         """
    
  6.         form = FormCustomer(request.POST)
    
  7. 
    
  8.         if form.is_valid():
    

    ...

  9.             data_form = form.cleaned_data
    
  10. 
    
  11.             first_name = data_form['first_name']
    
  12.             last_name = data_form['last_name']
    
  13.             cedula = data_form['cedula']
    
  14.             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 строкой. Телефонные номера не считаются целыми числами и могут содержать специальные символы, например, добавление кода города.

Вернуться на верх