Django no muestra una template

68 views
Skip to first unread message

Luis Fernando Ortiz

unread,
Sep 3, 2024, 6:30:15 AM9/3/24
to Django-es
Hola buenos días, compañeros.  He vuelto a retomar otra vez la programación en Django para adaptar un script Python que tengo ya probado y funcionando a Django.  Utilizo la versión Django 5.1

La aplicación web en principio funciona bien, pero me he encontrado con una incidencia que no me había pasado nunca, y es que una template no se muestra.  Vamos por partes con el código que estoy utilizando.

Lo primero la view que quiero mostrar (dejo los comentarios para ilustrar las pruebas que hecho):

# class generar(View):
class generar(TemplateView):
def generar(self):
# creamos un fichero .env que luego se usará para el programa de generar contraseñas
# primero, si existe un fichero .env, se saca una copia de seguridad --> .env.DDMMAA
# luego se genera el nuevo
fecha_de_hoy = datetime.now()
fecha_STR=fecha_de_hoy.strftime('%d%m%Y')
# comprobamos si existe .env, si existe se copia
# control de existencia del fichero de claves
fname=".env"
if os.path.isfile(fname):
# fname es el origen
destino = '.env.'+fecha_STR
shutil.copy(fname, destino)
clave = Fernet.generate_key()
with open(".env","wb") as archivo_clave:
archivo_clave.write(clave)
else:
clave = Fernet.generate_key()
with open(".env","wb") as archivo_clave:
archivo_clave.write(clave)
template_name = "Generar_semilla.html"
# return render(request, self.template_name)
return redirect('Generar_semilla')

También probé como función directamente en views.py, pero no fui capaz de hacerlo funcionar.

Ahora la urls.py de la app:

from django.urls import path
from .views import ListaPassword,PasswordDetailView,PasswordCreateView,PasswordUpdateView,PasswordDeleteView
from .views import generar

urlpatterns = [
path('password/new/', PasswordCreateView.as_view(), name='password_new'),
path('', ListaPassword.as_view(), name='home'),
path('password/<int:pk>/', PasswordDetailView.as_view(), name='password_detail'),
path('password/<int:pk>/edit/',PasswordUpdateView.as_view(), name='password_edit'),
path('password/<int:pk>/edit/',PasswordUpdateView.as_view(), name='password_edit'),
path('password/<int:pk>/delete/',PasswordDeleteView.as_view(), name='password_delete'),
path('password/utilidades/generar/', generar.as_view(), name="Generar_semilla"),

]

Y por último la template:

<!-- templates/Generar_semilla.html-->
{% extends 'base.html' %}
{% block content %}
<h1>¡ATENCIÓN! USAR CON CUIDADO!</h1>
<h1>PUEDES PERDER CONTRASEÑAS CREADAS PREVIAMENTE</h1>
<!-- <form action="" method="post">{% csrf_token %} -->
<!-- {{ form.as_p }} -->
<!-- <input type="submit" value="Guardar" /> -->
<!-- </form> -->
{% endblock content %}

En relación al settings.py, en principio está correcto porque renderiza el resto de las templates; el urls.py del proyecto recoge bien el urls de la aplicación

Llevo varios días atascado y no hay manera de que avance.

¿Qué puede pasar? ¿Cómo se corrige?

Perdonar las molestias y recibir un cordial saludo

Hernán Gastón

unread,
Sep 3, 2024, 6:52:37 AM9/3/24
to djan...@googlegroups.com
No estas renderizando, estas redirigiendo, se ve en las sig. lineas de código:
template_name = "Generar_semilla.html"
# return render(request, self.template_name)
return redirect('Generar_semilla')

O haces una redirección o renderizas pero no las 2.


--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/7a194f74-7375-4b81-a7c9-e254e066fabbn%40googlegroups.com.

Luis

unread,
Sep 3, 2024, 6:55:01 AM9/3/24
to djan...@googlegroups.com
Hum, he probado también con return render(request, self.template_name) y tampoco me ha hecho caso... Por eso lo he dejado comentado...

Estoy seguro que hay algo mal, pero no alcanzo a encontrarlo..


Gra



--
"Dadle más hardware a un ingeniero de Microsoft y seguro que lo llena con pijadas y clips que tienes que buscar para cerrarlos porque a algún capullo se le ocurrió programarlo. (V. Viñals)"

************************************
Luis Fernando Ortiz Gimenez
email: ortizgimenez at gmail dot com
*************************************

Hernán Gastón

unread,
Sep 3, 2024, 7:00:38 AM9/3/24
to djan...@googlegroups.com
Tenes captura del error?

Alejandro Avendaño

unread,
Sep 3, 2024, 8:07:47 AM9/3/24
to djan...@googlegroups.com

Yo veo que el metodo  "generar()" no esta definido en las clases de tipo "TemplateView". Deberias haber modificado alguno de los metodos predeterminados para garantizar que "generar()" sea llamado. Normalmente, se modifica el metodo get() o post() de las ClassViews para incorporar las customizaciones que deban hacerse 

Ademas, "TemplateView" requiere que "template_name" sea un atributo de la clase. Sin embargo, tu lo has definido dentro del metodo.  Ya por eso deberia darte un error: "TemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()'"

Te copio un link muy util donde se explica con detalles como funcionan las Class Based Views https://ccbv.co.uk/projects/Django/5.0/django.views.generic.base/TemplateView/










carlos

unread,
Sep 3, 2024, 11:52:44 AM9/3/24
to djan...@googlegroups.com
Fíjate en la documentación y el ejemplo de como funciona el TemplateView
con eso tendrás claro porque no te está funcionando

saludos



--
att.
Carlos Rocha

Luis

unread,
Sep 4, 2024, 2:17:39 AM9/4/24
to djan...@googlegroups.com
Hola compañeros, ayer a última hora resolví la cuestión.  La solución ha sido tal que así:

Reescribi la clase así:

class generar(TemplateView):
template_name = "Generar_semilla.html"
def generar(self):
# creamos un fichero .env que luego se usará para el programa de generar contraseñas
# primero, si existe un fichero .env, se saca una copia de seguridad --> .env.DDMMAA
# luego se genera el nuevo
fecha_de_hoy = datetime.now()
fecha_STR=fecha_de_hoy.strftime('%d%m%Y')
# comprobamos si existe .env, si existe se copia
# control de existencia del fichero de claves
fname=".env"
if os.path.isfile(fname):
# fname es el origen
destino = '.env.'+fecha_STR
shutil.copy(fname, destino)
clave = Fernet.generate_key()
with open(".env","wb") as archivo_clave:
archivo_clave.write(clave)
else:
clave = Fernet.generate_key()
with open(".env","wb") as archivo_clave:
archivo_clave.write(clave)
# return render(request, self.template_name)
return redirect('Generar_semilla')

y le di un repaso a la template base.html, donde para mi sorpresa, me encontre mal escrito el url correspondiente :-(
Con lo cual se resolvió la cuestión, ahora me queda crear una botonera para que se pueda arrancar
el proceso o cancelar, claro está...

Un saludo y perdón por las molestias que os he ocasionado



Reply all
Reply to author
Forward
0 new messages