Django Представления на основе классов, не отображающие переменные в шаблоне - PullRequest
0 голосов
/ 01 февраля 2020

Я довольно новичок в Django и уже много читал о представлениях на основе классов, прежде чем приехать сюда. Я пытаюсь создать одностраничный веб-сайт с динамическими c блоками, которые можно написать от администратора Django. Моя проблема в том, что мне не удается отобразить переменные из моей базы данных в моем шаблоне. Вот что я написал:

models.py

from django.db import models
from tinymce.models import HTMLField

class MyResume(models.Model):
    subline = models.CharField(max_length=200)
    content = HTMLField()

    class Meta:
        verbose_name = "My Resume"
        verbose_name_plural = "My Resume"

    def __str__(self):
        return "My Resume"

class AboutMe(models.Model):
    subline = models.CharField(max_length=200)
    content = HTMLField()
    cover_img = models.ImageField(upload_to="about_me")

    class Meta:
        verbose_name = "About me"
        verbose_name_plural = "About me"

    def __str__(self):
        return "About me"

class Experience(models.Model):
    subline = models.CharField(max_length=200)
    pres_content = models.TextField()
    exp_content = HTMLField()
    date_exp = models.IntegerField()

    class Meta:
        verbose_name = "Experience"
        verbose_name_plural = "Experiences"

    def __str__(self):
        return "Experience"

class ProjectPost(models.Model):
    title = models.CharField(max_length=200)
    technology = models.CharField(max_length=100)
    subline = models.CharField(max_length=200)
    content = HTMLField()
    project_post_cover = models.ImageField(upload_to="projectpost_cover")

    class Meta:
        verbose_name = "Project Post"
        verbose_name_plural = "Project Posts"

    def __str__(self):
        return self.title

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    overview = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    content = HTMLField()
    blogpost_thumbnail = models.ImageField(upload_to="blogpost_thumbnail")

    class Meta:
        verbose_name = "Blog Post"
        verbose_name_plural = "Blog Posts"

    def __str__(self):
        return self.title

class Contact(models.Model):
    subline = models.CharField(max_length=200)
    presentation_content = HTMLField()

    def __str__(self):
        return "Contact section text"

views.py

from django.shortcuts import render
from django.views.generic.base import TemplateView
from .models import *

class IndexTemplateView(TemplateView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs) # first, call super get context data
        context['myresume'] = MyResume.objects.all()
        context['aboutme'] = AboutMe.objects.all()
        context['experience'] = Experience.objects.all()
        context['projectpost'] = ProjectPost.objects.all()
        context['blogpost'] = BlogPost.objects.all()
        context['contact'] = Contact.objects.all()
        return context

core.urls.py:

from django.urls import path
from .views import IndexTemplateView

urlpatterns = [
    path('', IndexTemplateView.as_view()),
]

appname.urls.py:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^tinymce/', include('tinymce.urls')),
    path('', include('core.urls')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

и фрагмент из моего индекса. html template:

{% extends 'base.html' %}
{% load static %}
{% block content %}

(...)

<!-- ==================== ABOUT ==================== -->
    <section id="about" class="section">
        <h2 class="title">ABOUT</h2>
        <div class="section-des">
            {{ aboutme.subline }}
        </div>

        <div class="content-670">
            <p>
                {{ aboutme.content }}
            </p>
        </div>

        <img class="about-img block-right" data-jarallax-element="0 -40" src="{{ aboutme.cover_img.url }}" alt="">

(...)

{% endblock content %}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Все переменные, которые вы добавили в контекст шаблона, querysets , а не объекты. Но вы пытаетесь прочитать их как отдельные объекты в шаблоне, поэтому он не работает. У вас есть два варианта:

  1. Итерация по каждому набору запросов в вашем шаблоне:

    {% for item in aboutme %}
         <h2 class="title">ABOUT</h2>
        {{ item.subline }}
        {{ item.content }}
     {% endfor %}
    
  2. Если вы хотите отобразить только одну из каждой модели , затем вам нужно исправить метод контекста, чтобы он возвращал только один объект, например,

    context['aboutme'] = AboutMe.objects.first()
    

Где здесь вы просто возвращаете первый AboutMe объект в базе данных. Если вы сделаете это, то ваш существующий шаблон logi c будет работать. То, как вы определяете, какой объект возвращать, зависит от того, как выглядят ваши данные.

0 голосов
/ 01 февраля 2020
{% for obj in myresume %}
 <p>{{ obj.subline }}</p>
{% endfor %}

{% for obj in aboutme %}
 <p>{{ obj.subline }}</p>
{% endfor %}

вы можете называть ваши объекты таким образом в ваших шаблонах. Также измените функцию str в моделях, чтобы получить динамическое содержимое c.

class MyResume(models.Model):
    subline = models.CharField(max_length=200)
    content = HTMLField()

    class Meta:
        verbose_name = "My Resume"
        verbose_name_plural = "My Resume"

    def __str__(self):
        return self.sublime
...