簡體   English   中英

Django 中 /crear-cliente/ 的類型錯誤

[英]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 中

  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 類制作了表單,我將向您展示表單代碼、視圖和 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 上使用MinLengthValidatorMaxLengthValidator ,它嘗試在整數上使用len() function。 這是不可能的。 因此,您的cedulaphone_number字段將產生object of type 'int' has no len()錯誤。 您可以考慮將MaxValueValidatorMinValueValidatorinteger用於驗證器,而不是MinLengthValidatorMaxLengthValidator ,或者將字段更改為CharField

我不確定cedula是什么,但我建議將phone_number設為字符串。 電話號碼不被視為整數,可以包含特殊字符,例如添加區號。

暫無
暫無

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

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