es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El formulario de Django no se guarda en la base de datos mediante ModelForm.

Estoy tratando de agregar mi formulario a la base de datos utilizando ModelForm, pero no se está guardando ni imprimiendo el formulario en la vista. También he intentado guardar cada campo por separado en la vista a través de los datos limpios, pero no se inserta nada en la base de datos.

mi view.py

def index(request):
    component = Component.objects.all()
    form = ComponentModelForm()
    if request.method == 'POST':
        form = ComponentModelForm(request.POST)
        print(form)
        if form.is_valid():
            form.save()
            return redirect('/maintenance')  
    context = {
        'components': component,
        'form': ComponentModelForm(),
    }
    return render(request, 'maintenance/index.html', context)

models.py

class Component(MPTTModel):
    name = models.CharField(max_length=100)
    manufacturer = models.CharField(max_length=100)
    model = models.CharField(max_length=100)
    serial_number = models.CharField(max_length=255)
    price = models.IntegerField()
    note = models.TextField()
    parent = TreeForeignKey("self", verbose_name=(
        "Parent Component"), blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.id}, {self.name}"

forms.py

class ComponentModelForm(forms.ModelForm):
    class Meta:
        model = Component
        fields = ("name",
                  "manufacturer",
                  "model",
                  "serial_number",
                  "price",
                  "note",
                  "parent",)

la plantilla:

<div>
     <form method='POST' action=''>
        {% csrf_token %}
        {{form.as_p}}
        <input type="submit" value='Create'>
     </form>
  </div>
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Por el código proporcionado, parece que el problema podría estar en la declaración if en la vista index donde estás verificando si el método de solicitud es POST. La condición debería ser if request.method == 'POST': en lugar de if request == 'POST':.

    Además, en el bloque else después de if form.is_valid():, estás creando una nueva instancia del formulario en lugar de reutilizar el existente. Para solucionar esto, elimina la línea form = ComponentModelForm() del bloque else.

    Aquí está la vista index actualizada:

    def index(request):
        component = Component.objects.all()
        form = ComponentModelForm()
        if request.method == 'POST':
            form = ComponentModelForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('/maintenance')
        context = {
            'components': component,
            'form': form,
        }
        return render(request, 'maintenance/index.html', context)
    

    Además, asegúrate de haber incluido el campo input para el campo parent en tu plantilla HTML, ya que es obligatorio en tu ComponentModelForm.

Comments are closed.