Шаблон Django не отображается из базы данных - PullRequest
0 голосов
/ 13 июня 2019

Я использую Представления на основе классов , и пока все идет хорошо. Недавно я наткнулся на что-то логичное или связанное с кодом, которое я не могу понять.

У меня есть HTML-файл, куда я хочу передать или отобразить две мои модели: PhotographyData и Pictures. Я успешно могу пройти через модели с помощью двух разных ListView. Но в ListView Pictures не отображаются какие-либо данные, а отображается идентификатор объекта.

Аналогичным образом я попытался создать PicturesDetailView, чтобы проверить, не вызывает ли база данных каких-либо ошибок, и даже в этом DetailView не передаются никакие данные или какой-либо идентификатор.

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)

DetailView для изображений

View.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' width="124" height="124"/>
{% endfor %}
</div>

{% endblock asd %}

photography.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' width="124" height="124"/></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 формы для сохранения данных в БД, и она работает.

Нет ошибок, из-за которых непонятно, почему данные не проходят должным образом. Хотя он успешно сохранен и показан в разделе администратора.

Problem

1 Ответ

1 голос
/ 13 июня 2019

Это все немного запутано. У вас есть один шаблон и один 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...