首页 > 解决方案 > Django Views 存在不允许所有上下文变量出现在模板中的问题

问题描述

我制作了一个滑块模型,其中包含 3 个与其相关的图像和文本以在轮播中滑动

我的问题是我希望这些图像按照模型分配的顺序显示,但只出现一个。

如果我删除{% if sliders %} {% for slider in sliders %}最新的图像只出现,因为在视图中它被过滤了 .latest('timestamp')

我也尝试.latest('timestamp')在视图中替换.all()它仍然没有用

这是模型:

class Slider(models.Model):
    title = models.CharField(max_length=60)
    image = models.ImageField(blank=False, upload_to='Marketing')
    order = models.IntegerField(default=0)
    header_text = models.CharField(max_length=120, null=True, blank=True)
    middle_text = models.CharField(max_length=120, null=True, blank=True)
    footer_text = models.CharField(max_length=120, null=True, blank=True)
    button_text = models.CharField(max_length=120, null=True, blank=True)
    active = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    class Meta:
        ordering = ['order']

    def __str__(self):
        return self.title

    def get_image_url(self):
        return "%s/%s" % (settings.MEDIA_URL, self.image)

这是视图:

class HomeView(ListView):
    model = Item
    paginate_by = 10
    template_name = "home.html"

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        try:
            context['marketing_message'] = MarketingMessage.objects.filter(
                active=True).latest('timestamp')
        except MarketingMessage.DoesNotExist:
            context['marketing_message'] = None
        try:
            context['slider'] = Slider.objects.filter(
                active=True).latest('timestamp')
        except Slider.DoesNotExist:
            context['slider'] = None
        return context

这是模板:

        {% if slider %}
        {% for slider in sliders %}
            <div class="carousel-item {% if forloop.first %} active {% endif %}">
                <div class="view" style="background-image: url('{{ slider.get_image_url }}'); background-repeat: no-repeat; background-size: cover;">
                    <div class="mask rgba-black-strong d-flex justify-content-center align-items-center">
                        <div class="text-center white-text mx-5 wow fadeIn">
                            <h1 class="mb-4">
                            {% if slider.header_text %}
                                <strong>{{ slider.header_text }}</strong>
                            {% endif %}
                            </h1>
                            <p>
                                {% if slider.middle_text %}
                                <strong>{{ slider.middle_text }}</strong>
                                {% endif %}
                            </p>
                            <p class="mb-4 d-none d-md-block">
                                {% if slider.footer_text %}
                                <strong>{{ slider.footer_text }}
                                </strong>
                                {% endif %}
                            </p>
                            {% if slider.button_text %}                            
                            <a target="_blank" href="" class="btn btn-outline-white btn-lg">
                            {{ slider.button_text }}
                            <i class="fas fa-graduation-cap ml-2"></i>
                            </a>
                            {% endif %}
                        </div>
                    </div>
                </div>
            </div>
        {% endfor %} 
        {% endif %}

标签: django

解决方案


进行以下更改

视图.py

class HomeView(ListView):
    model = Item
    paginate_by = 10
    template_name = "home.html"

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        try:
            context['marketing_message'] = MarketingMessage.objects.filter(active=True).latest('timestamp')
        except MarketingMessage.DoesNotExist:
            context['marketing_message'] = None
        try:
            context['sliders'] = Slider.objects.filter(active=True).order_by('timestamp')
        except Slider.DoesNotExist:
            context['sliders'] = None
        return context

模板

{% if sliders %}
{% for slider in sliders %}
    #Your html code
{% endfor %}
{% endif %}

推荐阅读