【问题标题】:Django Class Based Views not rendering variables in TemplateDjango 基于类的视图不在模板中呈现变量
【发布时间】:2020-05-17 17:14:56
【问题描述】:

我对 Django 还是很陌生,在来这里之前已经阅读了很多关于基于类的视图的内容。我正在尝试构建一个单页网站,其中包含可以从 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)

还有一个来自我的 index.html 模板的 sn-p:

{% 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 %}

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案1】:

    您添加到模板上下文中的所有变量都是querysets,而不是对象。但是您试图将它们作为模板中的单个对象读取,这就是它不起作用的原因。你有两个选择:

    1. 遍历模板中的每个查询集:

      {% for item in aboutme %}
           <h2 class="title">ABOUT</h2>
          {{ item.subline }}
          {{ item.content }}
       {% endfor %}
      
    2. 如果你只想显示每个模型中的一个,那么你需要修复你的上下文方法只返回一个对象,例如,

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

    在这里,您只是返回数据库中的第一个 AboutMe 对象。如果您这样做,那么您现有的模板逻辑将起作用。您如何确定要返回哪个对象取决于您的数据是什么样的。

    【讨论】:

    • 正确,我测试了两种理解方式,我想我现在明白了。非常感谢@solarissmoke!我现在要阅读有关查询集的更多信息:)
    【解决方案2】:
    {% for obj in myresume %}
     <p>{{ obj.subline }}</p>
    {% endfor %}
    
    {% for obj in aboutme %}
     <p>{{ obj.subline }}</p>
    {% endfor %}
    

    您可以在模板中以这种方式调用您的对象。同时修改模型中的str函数来获取动态内容。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2018-03-25
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多