Estoy construyendo un sitio web de reserva de autobuses usando Django. Después de que el usuario busca autobuses en una ruta específica, se muestra una lista que muestra los autobuses disponibles. Cada elemento de la lista, es decir, el autobús, tiene un botón de libro que lleva a una nueva página llamada 'asientos.html'. Quiero pasar el número de autobús y otra información a la vista de 'asientos' para poder mostrar la cantidad de asientos disponibles y javascript también puede usar esta información. Aquí está mi código
vistas.py
def find_bus(request): form = forms.FormFindBus template = 'home.html' context = {'form': form} return render(request, template, context) def select(request): bus_type = request.GET.get('bus_type') bus_from = request.GET.get('bus_from') bus_to = request.GET.get('bus_to') date_string = request.GET.get('date') qs = Bus.objects.filter(type_of_bus=bus_type, route__location_from=bus_from, route__location_to=bus_to, date=date_string) context = {'qs': qs,} template = 'select.html' return render(request, template, context) def seats(request): template = 'seats.html' context = {} return render(request, template, context)seleccionar.html
{% for info in qs %} <a href="{% url 'book:seats' %}">Book</a> <ul> <li><b>Bus Number -</b> {{ info.bus_number }}</li> <li><b>Route -</b> {{ info.route }}</li> <li><b>Date -</b> {{ info.date }}</li> <li><b>Time -</b>{{ info.time }}</li> </ul> </div> {% endfor %}Como puede ver, el conjunto de consultas se pasa en select.html, donde uso for loop para mostrar todos los buses disponibles junto con su información. Luego hago clic en reservar para reservar los asientos de mi elección de autobús deseada. Quiero que cuando haga clic en reservar, la información del autobús también pase a la siguiente plantilla, es decir, asientos.html, de modo que pueda usar esa información para mostrar los asientos disponibles y otra información relacionada. Aquí hay algunas capturas de pantalla para ayudarlos a obtener una mejor imagen.
Como se puede ver en la primera imagen el usuario ingresa su consulta. Luego, se muestra una lista de autobuses en la segunda imagen o, en este caso, solo un autobús. Luego hace clic en reservar en ese autobús y se muestra un plano de asientos. ¿Cómo puedo pasar información de la plantilla 'select.html' a la vista de asientos? Por favor, no sugiera pasar información usando url. Puede conducir a la manipulación muy fácilmente.
Por favor, no sugiera pasar información usando url. Puede conducir a la manipulación muy fácilmente.
Lamentablemente, cualquier otra forma de pasar la información a la vista no es mucho mejor ni más segura.
Nunca confíes en la entrada del usuario.
Independientemente de la forma que elija al final, tendrá que validar la entrada.
Y usar URL tiene algunas ventajas. Por ejemplo: puede enviar un enlace a la ruta que acaba de encontrar a un amigo (el llamado enlace profundo). De lo contrario, su amigo tendría que hacer clic en su formulario por sí mismo.
Si todavía está interesado en hacer esto por URL, puede hacerlo de la siguiente manera:
Puede cambiar su esquema de URL por la URL que llamó book:seats para que contenga toda la información requerida. Suponga que book:seat tiene el siguiente aspecto en su urls.py :
url(r'^book/seats/$', views.seats, name='book:seats') Debe cambiar este patrón de URL para que contenga toda la información que desea pasar a la vista de seats :
url(r'^book/seats/(?P<bus_number>\w+)/(?P<route>\w+)/(?P<date>\w+)/(?P<time>\w+)$', views.seats, name='book:seats')Esto agregaría un llamado grupo con nombre a su patrón de URL. Puede leer acerca de los grupos con nombre aquí: documentación de grupos con nombre . Obviamente, tendrá que modificar este patrón de URL de ejemplo para que se ajuste a sus necesidades.
El siguiente paso es actualizar su función de vista para manejar todos esos argumentos de vista adicionales:
def seats(request, bus_number, route, date, time): template = 'seats.html' context = {} return render(request, template, context)El último paso es modificar la forma en que representa el enlace en su plantilla:
<a href="{% url 'book:seats' info.bus_number info.route info.date info.time %}">Book</a> Debe agregar los argumentos en el mismo orden en que se usan en la función de seats . Puede leer más sobre esto en la documentación oficial aquí: documentación de la etiqueta de la plantilla .