Formulario de Modelo de Django con desplegable de Clave Externa
Tengo un problema y no pude encontrar el error.
Mi campo desplegable con clave externa muestra “Cliente objeto(1)”, pero mis modelos, vistas y formularios son similares en todas las vistas que tienen la misma situación.
Modelo:
class Cliente(models.Model):
nombre = CharField(max_length=50)
cnpj = IntegerField()
fechaCreacion = DateTimeField(auto_now_add=True)
def __str__(self):
return self.nombre
Modelo para el producto:
class ProductoCliente(models.Model):
def rutaArchivo(producto, archivo):
return os.path.join('productos', producto, archivo)
numeroSerie = CharField(max_length=30, null=True)
producto = CharField(max_length=30)
archivo = FileField(upload_to=rutaArchivo)
cliente = ForeignKey(Cliente, on_delete=CASCADE)
fechaCreacion = DateTimeField(auto_now_add=True)
def __str__(self):
return self.id
Vistas:
def NuevoProductoCliente(request):
crearProductoCliente = FormularioProductoCliente()
if request.method == 'POST':
crearProductoCliente = FormularioProductoCliente(request.POST or None)
if crearProductoCliente.is_valid():
crearProductoCliente.save()
return redirect('productos:Producto_Cliente')
else:
crearProductoCliente = FormularioProductoCliente()
contexto = {'crearProductoCliente': crearProductoCliente}
return render(request, 'productos/NuevoProductoCliente.html', contexto)
Formularios:
class FormularioProductoCliente(ModelForm):
numeroSerie = fields.CharField(blank=True)
class Meta:
model = ProductoCliente
fields = [
'numeroSerie',
'producto',
'cliente',
'archivo',
]
labels = {
'numeroSerie': ('Número de Serie'),
'producto': ('Producto'),
'cliente': ('Cliente'),
'archivo': ('Archivo'),
}
Resultado:
https://imgur.com/Cft5AOW
davy.ai
El problema parece ser que el menú desplegable para el campo “cliente” muestra “Client object(1)” en lugar del nombre real del cliente. Esto probablemente se debe a que el método self en el modelo Cliente está devolviendo el nombre del cliente, pero en realidad debería llamarse str.
Para solucionar el problema, cambie el método self en el modelo Cliente a str:
Esto debería mostrar el nombre real del cliente en el menú desplegable en lugar de “Client object(1)”.