Django视图模板筛选器数据库

2024-05-18 23:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

过滤上下文的最佳方法是什么。我想在我的索引页上查看来自Roslina的最后三个对象,并用相同的nazwa\u polska(外键)与它们相关的所有图像

my model.py
**class Roslina(models.Model):
    id_rosliny = models.AutoField(primary_key=True)
    nazwa_polska = models.CharField(max_length=256)
    nazwa_lacinska = models.CharField(max_length=256)
    opis = models.TextField()
    data = models.DateField()
    def __str__(self):
        return self.nazwa_polska
class Images(models.Model):
    nazwa_polska = models.ForeignKey(Roslina, related_name='image', on_delete=models.CASCADE)
    image = models.ImageField(max_length=255, upload_to=generate_filename);
    def __str__(self):
        return self.nazwa_polska.nazwa_polska**

视图.py

from django.shortcuts import render
from django.views.generic import ListView,TemplateView
from . import models
# Create your views here.
class IndexView(TemplateView):
    template_name='index.html'
    def get_context_data(self, **kwargs):
         context = super(IndexView, self).get_context_data(**kwargs)
         context['zdjecia'] = models.Images.objects.all()
         context['rosliny'] = models.Roslina.objects.all()
         return context
class WyborAtlasu(TemplateView):
    template_name='basic_app/wyborAtlasu.html'

Tags: namefromimportselfdatareturnmodelsdef
1条回答
网友
1楼 · 发布于 2024-05-18 23:29:09

I want to view on my index page last three objects from Roslina

“最后一个”依据什么标准?但无论如何,解决方案是sort your queryset在所需的字段上-首先使用后代排序获取“最后”记录(反向排序)-然后slice it获取前三条记录。这最好在视图本身中完成

def get_context_data(self, **kwargs):
    context = super(IndexView, self).get_context_data(**kwargs)
    last_rosliny =  models.Roslina.objects.order_by("-date")[:3]
    context['rosliny'] = last_rosliny
    # you don't need this one, cf below
    # context['zdjecia'] = models.Images.objects.all()
    return context

and related to them all Images with the same nazwa_polska(foreign_key)

根据您的模型定义,您可以通过Roslina的“图像”相关描述符获得Roslina的相关图像(在您的示例中,它被命名为“图像”,因为您明确地将它命名为:models.ForeignKey(Roslina, related_name='image'...)-images会是一个更好的名称,但无论如何),即:

r = Roslina.objects.get(id_rosliny=<id_of_a_rosliny_here>)
for image in r.image.all():
    print(image.pk, image.image)

现在,由于Django模板语言允许属性查找和方法调用(对于至少不接受任何参数的方法),您不需要将图像添加到视图的上下文中,您可以直接从模板中的Roslina访问它们:

# yourtemplate.html 
<ul>
  {% for roslina in rosliny %}
  <li>
    {{ roslina.nazwa_polska }}
    <ul>
      {% for image in roslina.image.all %}
      <li>{{ image.pk }} - {{ image.image.url }}</li>
      {% endfor %}
    </ul>
  </li>
  {% endfor %}
</ul>

PS:希望我的单数/复数形式正确,对不起,恐怕我不会说你的语言;)

相关问题 更多 >

    热门问题