Django 模板未从数据库呈现

Posted

技术标签:

【中文标题】Django 模板未从数据库呈现【英文标题】:Django Template not rendering from database 【发布时间】:2019-10-27 18:25:33 【问题描述】:

我正在使用基于类的视图,到目前为止一切正常。 最近我遇到了一些逻辑或代码相关的东西,我无法理解。

我有一个 html 文件,我想在其中传递或显示我的两个模型: PhotographyDataPictures。我成功地通过使用两个不同的ListView 传递模型。但是图片列表视图没有显示任何数据,但它显示了对象 ID。

同样,我尝试创建 PicturesDetailView 来检查数据库是否没有导致任何错误,即使在该 DetailView 中也没有任何数据或任何 id 被传递。

views.py

class PhotographyListView(ListView):
    model = PhotographyData
    template_name = "projectfiles/PhotographyView.html"

    def get_queryset(self):
        return PhotographyData.objects.all()


class PicturesListView(ListView):
    model = Pictures
    template_name = "projectfiles/PhotographyView.html"
    queryset = Pictures.objects.all()


class PicturesDetail(DetailView):
    model = Pictures
    template_name = 'projectfiles/View.html'

models.py

class PhotographyData(models.Model):
    photography_pkg_name = models.CharField(
        "Photography package", max_length=50)
    photography_pic = models.ImageField(
        upload_to='images', blank=False, null=False)
    photography_price = models.SmallIntegerField(blank=False, null=False)


class Pictures(models.Model):
    pic_name = models.CharField(max_length=50)
    pic_caption = models.TextField()
    date = models.DateTimeField(auto_now=False, auto_now_add=False)
    location = models.CharField(max_length=50)
    pic = models.ImageField(upload_to = 'Pictures', blank=False, null=False)

forms.py

class PhotographyForm(forms.ModelForm):

#overriding the required attribute
    photography_pic = forms.ImageField(required=True)

    class Meta:
        model = PhotographyData
        fields = ("photography_pkg_name",
                  "photography_price", "photography_pic")


class PicturesForm(forms.ModelForm):
    # date = forms.DateField(
    #     widget=forms.DateInput(format=('%m/%d/%y'),
    #                            attrs='class': 'form-control',
    #                                   'placeholder': ' Month/Date/Year'))

    class Meta:
        model = Pictures
        fields = ("pic_name", "pic_caption",
                  "date", "location", "pic")

    widgets = 
        # 'date': forms.DateTimeField(
        #     attrs='placeholder': "Month/Date/Year:H:M" 
        #     ),

        'pic_caption': forms.Textarea(
            attrs='class': 'form-control', 'placeholder': 'Caption', 'rows': 3, 'cols': 21)

    pic = forms.ImageField(required = True)

#'%m/%d/%Y % H: % M'

urls.py

from django.conf.urls.static import static
from django.conf import settings
from django.conf.urls import url
from . import views
from django.views.generic import *
from django.views import generic
from django.contrib.auth import views as auth_views

from .views import (
    HomeView,
    Food_CreateView,
    Decor_CreateView,
    Photography_CreateView,
    FoodListView,
    DecorListView,
    PhotographyListView,
    PicturesCreateView,
    PicturesDetail)

urlpatterns = [
    url(r'^(?i)home/$', HomeView.as_view(), name='Home-Page'),
    url(r'^(?i)addpic/$', Photography_CreateView.as_view(), name='Add-Pic'),
    url(r'^(?i)addabc/$', PicturesCreateView.as_view(), name='Add-Pic'),
    url(r'^(?i)PhotoView/$', PhotographyListView.as_view(), name='Photo-View'),
    url(r'^(?i)(?P<pk>[0-9]+)/$', PicturesDetail.as_view(), name='Pic-View'),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

图片的详细视图

查看.html

<title>123</title>
% include 'projectfiles/base.html' %

ABC
<div class='collection'>
% for x in object_list %
<br>
ID:x.id<br>
NAME:x.pic_name<br>
DATE:x.date<br>
Location:x.location
Details:x.pic_caption

<img src=" i.pic.url " alt='Not found'  />
% endfor %
</div>

% endblock asd %

摄影.html

<title>VIEW</title>
% include 'projectfiles/base.html' %

% block asd %


<div class='collection'>
% for i in object_list %

i.photography_pkg_name
i.photography_price
<a href=#> <img src=" i.photography_pic.url " alt='Not found'  /></a>
% endfor %
</div>
<br>
<div class='collection'>

% for x in object_list %
ABC<br>
ID:x.id<br>
% comment % ID:<a href=% url 'Pic-View' x.id %>x.id</a><br> % endcomment %
NAME:x.pic_name<br>
DATE:x.date<br>
Location:x.location
% endfor %
</div>


% endcomment %

% endblock asd %

我正在使用 Django forms 将数据保存在数据库中,并且它正在工作。

没有任何错误导致难以理解为什么数据不能正确传递。虽然它已成功保存并显示在管理部分。

【问题讨论】:

不清楚你的问题是什么。除此之外,您似乎没有 PicturesListView 的 URL。 究竟,您在哪个 URL 上看到了什么,这与您的预期有何不同? (另外,可能不相关,但这根本不是您使用模板继承的方式。请返回并阅读template inheritance docs。) URL 只是传递数据以进行显示。如果有帮助,我会给你展示一个视觉表示。 但这并没有回答我的问题。您实际使用哪个 URL 来显示问题?为什么 PicturesListView 没有呢? url(r'^(?i)PhotoView/$', PhotographyListView.as_view(), name='Photo-View'), 用于列表视图 url(r'^(?i)(?P[0-9]+)/$', PicturesDetail.as_view(), name='Pic-View') 用于图片模型项详细信息 【参考方案1】:

这有点混乱。您有一个模板和一个 URL,但您似乎期望以某种方式调用两个视图。这根本不是它的工作原理:一个 URL 映射到一个视图。多个视图当然可以使用同一个模板,但不能同时使用。

因为您的 URL 调用 PhotographyListView,object_list 只会包含 PhotographyData 的实例。如果您还想显示图片列表,则需要将其添加到视图上下文中:

class PhotographyListView(ListView):
    model = PhotographyData
    template_name = "projectfiles/PhotographyView.html"


    def get_context_data(self, **kwargs):
        kwargs['pictures'] = Pictures.objects.all()
        return super().get_context_data(**kwargs)

现在模板中的第二个循环可以是% for x in pictures %

(虽然,我还是不明白你为什么想要这两个单独的列表。也许你想要 Picture 和 PhotographyData 之间的某种关系?如果是这样,你需要一个 ForeignKey 例如。)

【讨论】:

这个想法是页面的顶部将显示摄影包,页面的其余部分将显示摄影师的照片。正如您所说,object_list 仅适用于 PhotographyData,我同意并尝试过。但是我使用的是不同的视图,正如您在 Views.py 中看到的那样,使用 context_object_name = "Pics" 渲染图片模型中的图片,即使这样我也无法看到数据。奇怪的是数据也没有显示在 DetailView 中。希望您了解我在这里想要实现的目标。 我已经给你答案了。您不能同时调用两个视图。设置一个随机属性根本不会做任何事情,因为该视图没有被调用。就像我说的那样,如果你想将图片与特定的摄影师联系起来,那么你需要在模特中建立实际的关系。 另外,当然,详细视图不起作用,因为您在 object_list 中有一个循环;详细视图没有列表,它引用单个实例。 解决了详细视图问题。你能建议我的 ListView 问题的替代解决方案吗? 我已经给你答案了,包括代码。为什么需要替代方案?

以上是关于Django 模板未从数据库呈现的主要内容,如果未能解决你的问题,请参考以下文章

Django外键未在模板中呈现相关模型数据

有没有一种方法可以在 Django 的同一个模板中呈现多个视图?

Django - 在模板中呈现日期字段

如何正确使用 % include % 标签在 django 中呈现模板(如部分)?

从 django 中的单个视图呈现多个模板

在 Django 模板中生成 JSON 的陷阱