Cómo representar datos en una plantilla de {% included a.html%} en Django

Tengo un rank.html que es una plantilla que se comparte públicamente para muchas otras plantillas mediante el método {% include rank.html %} .

Esta plantilla mostrará la base de noticias de 48 horas en el número de clic.

Aquí está el view.py:

 def rank(self, request): hot_news_48h = h_mostViewed(48, News, '-pv') return render(request, "rank.html", { 'hot_news_48h': hot_news_48h,}) 

h_mostViewed (48, News, ‘-pv’) es una función que puede recuperar las publicaciones más vistas (pulsadas) en 48 horas. Funciona.

Aquí está el rank.html:

 
{% endfor %}

Aquí está el url.py:

 path('hot_news', views.rank, name="hot_news") 

El problema es que solo puedo obtener el html, pero no puedo recibir los datos.

Pero si abandono el método {% include rank.html%} e inserto el código de rank.html directamente dentro de cada plantilla que necesita esta función, puedo obtener los datos. Tome la plantilla new_detail.html como ejemplo:

Aquí está el view.py:

 def newsDetailView(request, news_pk): news = get_object_or_404(News, id=news_pk) all_comments = NewsComments.objects.filter(news=news) news.comment_nums = all_comments.count() news.save() News.objects.filter(id=news_pk).update(pv=F('pv') + 1) hot_news_48h = h_mostViewed(48, News, '-pv') relative_news = News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk)[:6] return render(request, "news_detail.html", { 'news': news, 'all_comments': all_comments, 'hot_news_48h': hot_news_48h, 'relative_news': relative_news }) 

Aquí está el urls.py:

 path('-', views.newsDetailView, name="news_detail"), 

Así que arriba, inserté directamente el código de rank.html en new_detail.html y funciona, puedo obtener los datos.

Mi pregunta es qué debo hacer o corregir, para poder obtener los datos con el método {% include rank.html%}. Debido a que {% include rank.html%} es simple y flexible. No quiero repetir el mismo código en varias plantillas iguales.

¡Muchas gracias por su paciencia!

¿Qué tal esto ?: Cree una carpeta “templatetags” en su aplicación y agregue un archivo “news_tags.py” o asígnele el nombre que desee. Luego puedes definir las tags que necesitas:

 from django.template import Library from your_app.models import your_model register = Library() @register.inclusion_tag('your_app/your_template.html') def hot_news(num, order): objects = News.objects.order_by(order)[:num] result['objects'] = objects return result 

En tus plantillas haces lo siguiente:

 {% load news_tags %} {% hot_news 48 '-pv' %} 

Luego cree una plantilla como ya lo hizo y haga referencia a ella en la etiqueta de inclusión. Entonces debería funcionar correctamente.

Si quiere que funcione para varios modelos, puede echar un vistazo a esto: https://docs.djangoproject.com/el/2.1/ref/applications/ El marco de aplicaciones le permite obtener modelos de una entrada de cadena.

Finalmente resolví el problema creando un procesador de contexto personalizado. https://www.youtube.com/watch?v=QTgkGBjjVYM