【问题标题】:Django : Object didn't load in HTML templateDjango:对象未在 HTML 模板中加载
【发布时间】:2018-11-17 13:01:15
【问题描述】:

我正在制作我的 Django 网站,但根据我的第一个网站模板(我的主页)遇到了问题。

环境:

  • Django 2.0.1
  • Python 3.5
  • MariaDB 10.1

问题:

根据我的观点,当我可以访问我的 Django 主页时,它应该会显示一个图像,但我什么也得不到。只有当我去其他地方并回到主页时,我才会得到我的照片。

我的代码:

我的模型.py

class Photo(models.Model) :

    Nom                 = models.CharField(max_length=50, verbose_name="Nom de l'objet", blank=False)
    Date                = models.DateField()
    ...
    Image_upload        = models.ImageField(upload_to='Media/', width_field=None, height_field=None, verbose_name="Image")

我的views.py:

from django.shortcuts import render
from Photographies.models import Photo


def Accueil(request):
    photo = Photo.objects.all().order_by('-Date')[0]

    return render(request, 'Accueil.html', {"photo": photo})

我的 HTML 模板:

<!--  This script lets to define homepage template for "Accueil" -->

{% extends 'Base_Accueil.html' %}

{% load staticfiles %}
{% load static %}

{% block content %}

        <div id="content">

            <br></br>

            <div id="content-1">

               <div id="presentation-title">
                    <p>Petit mot de l'Astrophotographe & Développeur du site</p>
               </div>
               <div id="presentation-text">
                    <p>  Je vous souhaite la bienvenue sur mon site dédié à l'Astrophotographie. A travers votre parcours sur celui-ci, vous allez découvrir ma passion pour la photographie des objets de l'Univers. Du Soleil, notre étoile, aux galaxies les plus lointaines en passant par les vastes amas de gaz qui composent l'infiniment grand, vous allez pouvoir contempler des objets atypiques de part leurs formes et leurs couleurs.</p><br />

                    <p> C'est avec plaisir que je vous invite à vous ballader sur mon site, découvrir ma galerie d'images, mes bricolages, mes articles & publications, ... Vous trouverez également le matériel astronomique employé pour la réalisation des différents clichés disponibles sur ce site ainsi que diverses informations complémentaires. N'hésitez pas à partager vos avis et à venir le visiter régulièrement pour entrevoir les nouvelles images astrophotographiques.</p><br />

                    <p align="center">Je vous souhaite une bonne visite !</p>   
               </div> 
            </div>

            <br></br>

            <div class="row">
            </div>

            <div id="content-2">
                <div id="presentation-image-récente">
                    <p>Dernière image publiée</p>
                </div>
                <div id="presentation-image">
                        <li class="image">
                            <img src='{{photo.Image_upload.url}}'/>
                            <p></p> 
                            <figcaption>
                            <div>
                                <center>
                                <p></p>
                                <p><b>{{photo.Nom}} ({{photo.Designation}})</b></p>


                                </center>
                            </div>
                            </figcaption>
                        </li>
                </div>
            </div>

            <div class="row">
            </div>
            <br></br>

        </div>
        <p></p>

{% endblock content %}

最后是我的 urls.py 文件:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^Accueil$', views.Accueil, name='Accueil'),
]

我的全局 urls.py 文件看起来像:

import os
from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic.base import TemplateView
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name=os.path.join(settings.BASE_DIR, 'Accueil/templates/Accueil.html')), name='accueil'),
    url(r'^admin/', admin.site.urls),
    url(r'^Accueil/', include('Accueil.urls')),
    url(r'^Materiel/', include('Materiel.urls')),
    url(r'^Photographies/', include('Photographies.urls')),
    url(r'^Articles/', include('Articles.urls')),
    url(r'^Meteo/', include('Meteo.urls')),
    url(r'^Presentation/', include('Presentation.urls')),
    url(r'^Contact/', include('Contact.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

根据这一行我怀疑有问题:

url(r'^$', TemplateView.as_view(template_name=os.path.join(settings.BASE_DIR, 'Accueil/templates/Accueil.html')), name='accueil'),

因为网址只是:http://localhost:8000 如果我写http://localhost:8000/Accueil/Accueil,它是相同的模板(我的主页),但带有我加载的图片。

【问题讨论】:

  • 这里有很多问题,但我不明白为什么你会认为这会起作用。您的第一个模式根本不调用视图,那么如何将 photo 传递给该模板?
  • @DanielRoseman 对不起,如果我只是通过一些堆栈问题和网络课程/教程自学了 Django。我会尝试改变我的第一个模式。
  • @BugHunter 我不确定,因为我只选择了最后一个。我认为这个问题(比如@DanielRoseman)来自我的 urls.py 文件

标签: python django


【解决方案1】:

我找到了解决办法:

我更改了 views.py 文件:

from django.views.generic.base import TemplateView
from Photographies.models import Photo


class AccueilTemplateView(TemplateView):

    template_name = "Accueil.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['photo'] = Photo.objects.all().order_by('-Date')[0]

        return context

然后,在我的全局 urls.py 文件中:

from django.conf.urls import url, include
from django.urls import path
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

from Accueil.views import AccueilTemplateView


urlpatterns = [
    path(r'', AccueilTemplateView.as_view(), name='accueil'),
    url(r'^admin/', admin.site.urls),
    url(r'^Accueil/', include('Accueil.urls')),
    url(r'^Materiel/', include('Materiel.urls')),
    url(r'^Photographies/', include('Photographies.urls')),
    url(r'^Articles/', include('Articles.urls')),
    url(r'^Meteo/', include('Meteo.urls')),
    url(r'^Presentation/', include('Presentation.urls')),
    url(r'^Contact/', include('Contact.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

最后根据 Accueil App 在我的 urls.py 文件中:

from django.conf.urls import url
from .views import AccueilTemplateView


urlpatterns = [
    url(r'^Accueil$', AccueilTemplateView.as_view(), name='Accueil'),
]

【讨论】:

  • 您的 urlpattern 确实存在问题。您正在使用 TemplateView 作为根路径。即使它使用正确的模板,它也没有传递任何模板上下文。因此,您在主页上看不到任何图像详细信息。在您的修复中,您正在使用视图并将其中的上下文传递给视图,因此在这种情况下可以正确渲染图像。附言顺便说一句,第二部电影不错:)
  • @neverwalkaloner 好的,谢谢你的解释!我理解我的错误,这就是为什么我找到了解决它的方法。有些事情又很模糊,不清楚,因为单独学习编程并不容易;)但是 Stackoverflow 让每个人都变得更好!了解每个个人问题。 PS:哦,谢谢你,你想要n°3吗? :P
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2016-03-11
  • 2016-09-28
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多