【问题标题】:Retrieve data from queryset and pass to template in django从查询集中检索数据并传递给 Django 中的模板
【发布时间】:2020-04-25 18:28:26
【问题描述】:

我有一个模型如下:

class Artwork(models.Model):
title              =     models.CharField(max_length=120)
collection         =     models.CharField(max_length=120,null=True)
slug               =     models.SlugField(blank=True, unique=True)
description        =     models.TextField()
price              =     models.DecimalField(decimal_places=2, max_digits=20, default=0)
image              =     models.ImageField(upload_to=upload_image_path, null=True, blank=True)
banner             =     models.ImageField(upload_to='artworks/banner')
video              =     models.FileField(upload_to='artworks/video',blank=True,null=True)
category           =     models.CharField(choices=CATEGORY_CHOICES, max_length=15)
views_count        =     models.IntegerField(default=150)
featured           =     models.BooleanField(default=False)
active             =     models.BooleanField(default=True)
created            =     models.DateTimeField(default=timezone.now)

和下面的视图:

def artwork_list_view(request):
queryset    = Artwork.objects.all()
context = {
    'objet_list':queryset,
}
return render(request, "artworks/list.html", context)

我在模板中使用查询集如下:

   <div style='min-height:80px;'><p >First Collection</p></div>

    {% for obj in object_list  %}
        <div  class="workSeriesThumbnailStrip">
                {% if obj.image %}
            <a href="{{ obj.get_absolute_url }}"><img src="{{ obj.image.url }}" style="float:left;width:67px;height:87px;margin:10px;" ></a>
            {% endif %}

        </div>
    {% endfor %}
   </div>

知道我有多个集合,并希望在集合中放置一个 for 循环,以在一行中显示每个集合的项目。但由于我是 django 的新手,我不知道如何检索集合列表并将它们传递给模板。请帮帮我。

【问题讨论】:

    标签: django listview templates django-queryset artwork


    【解决方案1】:

    object_list 键中有错字

    context = {
        'objet_list':queryset,
    }
    

    【讨论】:

    • 我编辑了它,这是一个错误。但我不能将集合传递给模板
    【解决方案2】:

    您也可以遍历 obj.collections。像这样

            {% for obj in object_list %} <div class="workSeriesThumbnailStrip"> 
    {% if obj.image %} 
    <a href="{{ obj.get_absolute_url }}">
    <img src="{{ obj.image.url }}" style="float:left;width:67px;height:87px;margin:10px;" ></a> 
    {% endif %} 
    </div>
        {%for collection in obj.collections%}
        <Div>{{colection}}<div/>
        {%end for%}
         {% endfor %}
    

    【讨论】:

    • 您能否也发布一个虚拟数据,以便我可以给您正确的答案,这意味着您的对象列表中有哪些数据
    • {{ obj.collection}}

      内部循环显示每个对象的集合。但是您建议 {%for collection in obj.collections%} 的 for 循环没有显示任何内容
    • 我该怎么办?
    • 有什么推荐的吗?
    • 显示的数据我需要那个结构
    【解决方案3】:
     from django.http import Http404
     from django.views.generic import ListView, DetailView, TemplateView
     from django.shortcuts import render, get_object_or_404
     from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
     from .models import Artwork
    
    
     class ArtworkFeaturedListView(ListView):
     template_name = "artworks/list.html"
     def get_queryset(self, *args, **kwargs):
         request = self.request
         return Artwork.objects.all().featured()
    
     class ArtworkFeaturedDetailView(DetailView):
         queryset = Artwork.objects.all().featured()
         template_name = "artworks/featured-detail.html"
    
     class ArtworkListView(ListView):
    
         template_name = "artworks/list.html"
    
         def get_queryset(self, *args, **kwargs):
             request = self.request
             return Artwork.objects.all()
     class ArtworkCategory(ListView):
         model = Artwork
         paginate_by = 20
    
         def get_queryset(self):
             self.category = self.kwargs['category']
             return Artwork.objects.filter(category=self.category)
    
    
         def get_context_data(self, **kwargs):
             context = super(ArtworkCategory, self).get_context_data(**kwargs)
             context['artwork_category'] = self.category
             return context
    
    
    
     class ArtworkCollection(ListView):
         model = Artwork
         paginate_by = 20
    
         def get_queryset(self):
             self.collection = self.kwargs['collection']
             return Artwork.objects.filter(collection=self.collection)
    
         def get_context_data(self, **kwargs):
             context = super(ArtworkCollection, self).get_context_data(**kwargs)
             context['artwork_collection'] = self.collection
             return context
    
    
         queryset    = Artwork.objects.all()
         context = {
             'object_list':queryset,
         }
         return render(request, "artworks/list.html", context)
    
    
     class ArtworkSearch(ListView):
         model = Artwork
         paginate_by = 5
    
         def get_queryset(self):
             query = self.request.GET.get('query')
             if query:
                 object_list = self.model.objects.filter(title__icontains=query)
    
             else:
                 object_list = self.model.objects.none()
             return object_list
    
     class ArtworkDetailSlugView(DetailView):
         queryset = Artwork.objects.all()
         template_name = "artworks/detail.html"
    
         def get_object(self, *args, **kwargs):
         request = self.request
         slug = self.kwargs.get('slug')
         instance = get_object_or_404(Artwork, slug=slug, active=True)
         return instance
    
     class ArtworkDetailView(DetailView):
         template_name = "artworks/detail.html"
         def get_context_data(self, *args, **kwargs):
             context = super(ArtworkDetailView, self).get_context_data(*args, **kwargs)        
             print(context)
            return context
    
        def get_object(self, *args, **kwargs):
            request = self.request
            pk = self.kwargs.get('pk')
            instance = Artwork.objects.get_by_id(pk)
            if instance is None:
                raise Http404("artwork doesn't exist")
            return instance
    
     def artwork_detail_view(request, pk=None, *args, **kwargs):
         instance = Artwork.objects.get_by_id(pk)
         if instance is None:
             raise Http404("artwork doesn't exist")
         context = {
             'object':instance
         }
        return render(request, "artworks/detail.html", context)
    

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2014-11-04
      • 2021-01-27
      • 2020-07-06
      • 2019-11-10
      • 2017-07-14
      相关资源
      最近更新 更多