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.

Método no permitido (POST): /

Estoy tratando de crear una tienda de una sola página. Hice un ListView de los artículos y se renderiza sin problemas. El carrito de compras estará en un modal. Hice el botón de compra, pero cada vez que lo presiono, dice:

Método no permitido (POST): /
Método no permitido: /
[22/Dic/2021 11:40:04] "POST / HTTP/1.1" 405 0

Aquí están mis vistas:

from django.shortcuts import render
from django.views.generic import ListView
from .models import Item
from .forms import AddCartForm

class ItemsListView(ListView):
    model = Item
    template_name = 'main_page.html'

def aBuy(request):
    form = AddCartForm
    if request.method == 'POST':
        print('COMPRAR COMPRAR')
    return render(request, 'main_page.html', {'form':form})

Este es el formulario:

class AddCartForm(ModelForm):
    class Meta:
        model = Item
        fields = ['price', 'quantity']

El formulario en HTML:

{% csrf_token %} {{ form }}

No puedo continuar con la lógica de agregarlo al carrito futuro debido a esto. print('COMPRAR COMPRAR') es solo para realizar pruebas.

En el archivo de URL solo está la página principal con ItemListView.as_view. Intenté colocar la función aBuy tanto dentro como fuera de él, pero el problema sigue existiendo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el método HTTP utilizado en el envío del formulario no está permitido, que en este caso es POST. La vista aBuy() solo acepta solicitudes POST, pero el punto final de la URL para esta parece ser /, que es la URL raíz de la aplicación. Esto podría entrar en conflicto con el punto final de la URL para la página principal, que también utiliza la URL raíz. Para resolver este problema, puedes cambiar el punto final de la URL para aBuy() a una ruta de URL diferente, como /comprar/, o utilizar AJAX para enviar el formulario de forma asíncrona sin recargar toda la página.

    Además, el formulario en la plantilla HTML necesita tener un atributo de acción que especifique el punto final de la URL para el envío del formulario. Puedes agregar un parámetro url a la llamada de render() en aBuy() para pasar el punto final de la URL para el envío del formulario a la plantilla, y utilizarlo en el atributo de acción de la etiqueta del formulario. Por ejemplo:

    En el archivo views.py:

    from django.urls import reverse
    
    def aBuy(request):
        form = AddCartForm()
        if request.method == 'POST':
            # procesa los datos del formulario aquí
            print('COMPRAR COMPRAR')
        url = reverse('comprar')  # o cualquier punto final de URL que elijas
        return render(request, 'main_page.html', {'form': form, 'url': url})
    

    En la plantilla HTML:

    <form name="comprar" method="POST" action="{{ url }}">
        {% csrf_token %}
        {{ form }}
        <input type="submit" class="btn btn-info butt" value="Comprar">
    </form>
    

Comments are closed.