variable template for bootstrap django django-views

for - import django template



Django-dos vistas, una página (3)

Este es el momento perfecto para introducir vistas basadas en clase.

los métodos de clase son esencialmente "sub vistas" que dividen la lógica en fragmentos reutilizables.

Si desea la legibilidad de las funciones divididas, solo mejora con el uso de las vistas basadas en clases de django (a través de toda la funcionalidad proporcionada de forma predeterminada y el acceso a la solicitud, kwargs, args, etc., a través de la instancia de la clase).

Los documentos incluso contienen un buen ejemplo para devolver una respuesta JSON o una respuesta HTML basada en los parámetros de solicitud (esta situación exacta).

¿La mejor parte? Puede reutilizar sus vistas basadas en clases como mixins en vistas futuras. Mire el ejemplo de documentos para ver cómo convertir cualquier vista basada en clase para manejar una respuesta JSON del contexto de la plantilla a través de una subclase simple.

Supongamos que tenemos una página de Django que muestra una lista de elementos y le permite al usuario completar un formulario para agregar a los elementos (llamemos a las publicaciones de elementos).

Lo que quiero: La URL de esta página hace referencia a una vista. La vista llama a otras dos vistas (llamadas "sub-vistas" en este documento), luego cada una de ellas muestra su sección y devuelve los resultados. La vista principal luego se une a los resultados de las subvistas y devuelve eso.

Lo ideal sería realizar una comprobación rápida de javascript en la página: si javascript está habilitado, el botón de envío del formulario será "Ajax''d" en la subvista que trata sobre la adición de formularios, y la página se actualizará de esa manera . Supongo que podría desencadenar una solicitud para actualizar la lista de publicaciones después o algo así.

Entonces, ¿cómo concatenar las dos subvistas en la vista principal? es posible?

ACTUALIZACIÓN : "sub-vista" es un término que inventé. Lo que quiero es una vista que Ajax pueda llamar directamente para devolver algo significativo, o desde otra vista (a la que llamaré "vista principal"). Si esta "vista principal" lo llama, ¿cómo maneja la vista principal la devolución de los datos de varias "subvistas"?

¿Hay una manera simple de hacer esto? ¿Es esta una forma adecuada de pensar en múltiples vistas en una página? ¿Debería preocuparme por la separación de responsabilidades?


Las vistas deben contener solo lógica relacionada con la vista:

  • Las vistas son para procesar solicitudes y servir los datos solicitados.
  • Eso incluye verificar la autorización / permiso del usuario y tratar con los parámetros dados
  • Si los datos solicitados no son triviales para obtener, externalice el código a una ubicación más apropiada (su modelo o definiciones de formulario u otro lugar personalizado)

Externalice los cálculos para hacerlos reutilizables y llame a estos métodos desde sus vistas para mantenerlos pequeños.

Sin embargo, tal vez usted quiera algo más, es decir, plantillas con extends e include .

Con extends , puede crear un diseño base para su código HTML y definir bloques específicos que se pueden representar en otro lugar. ¿Ejemplo? De acuerdo.

base.html:

<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>{% block title %}My Site{% endblock %}</title> </head> <body> <div id="header"> <h1>My Site</h1> </div> {% block content %}{% endblock %} </body> </html>

Luego, en cualquier otra plantilla, puede sobrescribir el title y el content los bloques que definimos en la plantilla base:

{% extends "base.html" %} {% block title %}My Page{% endblock %} {% block content %} <h2>My Page</h2> <div>lorem ipsum</div> {% endblock %}

Además, puede crear sub-plantillas como la siguiente, llamémosle _item.html :

<li class="item"> <span>{{ something.foo }}</span> <strong>{{ something.bar }}</span> </li>

Puede incluir ese fragmento de código en cualquier otra plantilla y pasar un número arbitrario de parámetros:

{% for something in mymodel.mym2mrelation.all %} {% include "_item.html" with something=something only %} {% endfor %}

Naturalmente, puedes combinar ambos conceptos. Al igual que:

{% extends "base.html" %} {% block title %}My Page{% endblock %} {% block content %} <h2>My Page</h2> <div>lorem ipsum</div> <ul> {% for something in mymodel.mym2mrelation.all %} {% include "_item.html" with something=something only %} {% endfor %} </ul> {% endblock %}

Espero que eso ayude.


Una vista en django es cualquier llamable que finalmente devuelve un objeto Respuesta. Desde ese punto de vista, podría dividir el trabajo en la organización que más le convenga. Tal vez su punto de vista delegados 100% a otros métodos.

En su caso, su vista principal llamaría a otras 2 funciones para obtener datos. Estas también podrían ser vistas si también aceptan un objeto de solicitud y lo utilizan. También tendrían que devolver los objetos de Respuesta para que se consideren vistas de django, ya que así es como los apuntarías a las URL. Pero realmente no le hace bien que otras dos vistas le devuelvan los objetos de Respuesta. Lo que probablemente desee es solo otros métodos que realicen tareas específicas y devuelvan algo de estructura de datos, o tal vez incluso un fragmento de una plantilla renderizada. Luego, usaría estos datos o fusionaría las cadenas de la plantilla y las devolvería en su Respuesta principal.

Si realmente está dispuesto a usar otras vistas que devuelven objetos de Respuesta, entonces puede hacer algo como sacar el cuerpo de ellos y fusionarlos en su propia respuesta:
https://docs.djangoproject.com/en/1.4/ref/request-response/

Realmente, nada es muy diferente de los tutoriales. Estás llamando a otros métodos para obtener datos. Si desea organizarlo, debe separar la lógica de procesamiento de datos de la función de vista. Su vista principal llamaría a estas funciones de procesamiento de datos para valores. Y sus "subvistas" serían simples vistas que también llaman a estas funciones de datos individuales y las envuelven en una Respuesta.

Seudo:

def mainView(request): val = data1() val2 = data2() response = # val + va2 + other stuff return response def subView1(request): val = data1() response = # val + stuff return response def subView2(request): val2 = data2() response = # val2 + stuff return response def data1(): val = # get data return val def data2(): val2 = # get data return val2