如何获取表中的整行并将其显示在模板中 [英] How to fetch an entire row in a table and display it in a template

查看:28
本文介绍了如何获取表中的整行并将其显示在模板中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的学校项目的电影院制作票务站点,我制作了两个模型,其中一个是 Movie 和两个 TimeSlot . Movie.time_slot TimeSlot 表具有 manytomany 关系.

我想发生的是,根据 Movie.title 和它的 day 显示电影的时间段.

例如,我希望显示下面的 Time Slots:行:

星期一: timeslot1.value timeslot2.value timeslot3.value timeslot4.value

假设当前日期是 Monday ,并且上面的 timeslots 不是<空空或<空空

这是我的 models.py :

 从django.db导入模型从django.contrib.auth.models导入AbstractUser从PIL导入图像类TimeSlot(models.Model):moviename = models.CharField(max_length = 100)日= models.CharField(max_length = 9)timeslot1 = models.CharField(max_length = 20,blank = True,null = True)timeslot2 = models.CharField(max_length = 20,blank = True,null = True)timeslot3 = models.CharField(max_length = 20,blank = True,null = True)timeslot4 = models.CharField(max_length = 20,blank = True,null = True)timeslot5 = models.CharField(max_length = 20,blank = True,null = True)timeslot6 = models.CharField(max_length = 20,blank = True,null = True)def __str __():返回{self.day}'的f'{self.movi​​ename}时隙Movie(models.Model)类:标题= models.CharField(max_length = 100)描述= models.TextField()release_date = models.CharField(max_length = 20)类型= models.CharField(max_length = 100)time_slot = models.ManyToManyField(TimeSlot,related_name = None)available_seats = models.PositiveSmallIntegerField(默认= 300)ticket_price = models.DecimalField(max_digits = 6,decimal_places = 2)图片= models.ImageField(默认='default.jpg',upload_to ='媒体/电影_海报')def __str __():返回f'{self.title}信息'def save(self,* args,** kwargs):超级(电影,自我).save(* args,** kwargs)图片= Image.open(self.image.path)如果image.height>200或image.width>200:output_size =(200,200)image.thumbnail(output_size)image.save(self.image.path) 

这是我的 views.py :

来自django.shortcuts的

 导入渲染从.models导入Movie,TimeSlotpagetitle ='在线订购车票'def home(要求):上下文= {电影列表":Movie.objects.all(),'timeslot':TimeSlot.objects.all(),标题":pagetitle}返回render(请求,'movies/home.html',上下文)def about(要求):返回render(request,'movies/about.html') 

这是我的home.html模板:

 {%封锁内容%}{%代表电影列表中的电影%%}< article class ="media content-section">< div class ="media-body">< div class ="article-metadata">< a class ="mr-2" href =#" style ="font-size:30px">{{movie.title}}</a>< small class ="text-muted">显示于:{{movie.release_date}}</small></div>< img src ="{{movie.image.url}}""alt =">< p class ="article-content">< strong>电影说明:</strong> {{movie.description}}< br>< strong>类型:</strong> {{movie.genre}}< br>< strong>时隙:</strong>< br>< strong>可用座位:</strong> {{movie.available_seats}}< br>< strong>机票价格:</strong> {{movie.ticket_price}}< br></p></div></article>{%endfor%}{%endblock%} 

在这件事奏效之前,谁能指导我?python新手,谢谢!

这是我的 django管理员内部和 Movie 应用程序下的外观:

时隙表中的数据如下:

当我单击标题时:

电影"表中的内容如下:

解决方案

如果您查看文档中的多对多示例,您可以使用 movie_instance.time_slot.all()访问时隙.

在您看来,您可以省略 TimeSlot 查询集:

  def home(request):上下文= {电影列表":Movie.objects.all(),标题":pagetitle}对于上下文中的m ['movielist']:#用于调试,请稍后删除print(m.time_slot.all())#用于调试,稍后删除返回render(请求,'movies/home.html',上下文) 

在您的模板中,您可以尝试

 < strong>时间段:</strong>{%for movie.time_slot.all%中的t}{{t.timeslot1}}{{t.timeslot2}}...{%endfor%} 


或者您可以在模型中添加一个方法来过滤和准备所需的字符串,然后在模板中为每个电影实例调用该方法.

  class Movie(models.Model):def get_monday_time_slots(self):返回self.time_slot.filter(day ='monday') 

有帮助吗?

I am trying to make a ticketing site for a Cinema which my project in school, and I made two models, 1 is Movie and 2 TimeSlot. Movie.time_slot has a manytomanyrelation to TimeSlot table.

What I want to happen is, display the timeslot for the Movie depending on the Movie.title and on what day it is.

For example, i want the Time Slots: row below to display:

Monday: timeslot1.value, timeslot2.value, timeslot3.value, timeslot4.value

given that the current day is Monday and timeslots above were not empty or null

Here is my models.py:


from django.db import models
from django.contrib.auth.models import AbstractUser
from PIL import Image

class TimeSlot(models.Model):
    moviename = models.CharField(max_length=100)
    day = models.CharField(max_length = 9)
    timeslot1 = models.CharField(max_length = 20,blank = True, null = True)
    timeslot2 = models.CharField(max_length = 20,blank = True, null = True)
    timeslot3 = models.CharField(max_length = 20,blank = True, null = True)
    timeslot4 = models.CharField(max_length = 20,blank = True, null = True)
    timeslot5 = models.CharField(max_length = 20,blank = True, null = True)
    timeslot6 = models.CharField(max_length = 20,blank = True, null = True)

    def __str__(self):
        return f'{self.moviename} timeslot for {self.day}'


class Movie(models.Model):
    title = models.CharField(max_length= 100)
    description = models.TextField()
    release_date = models.CharField(max_length=20)
    genre = models.CharField(max_length=100)
    time_slot = models.ManyToManyField(TimeSlot, related_name=None)
    available_seats = models.PositiveSmallIntegerField(default= 300)
    ticket_price = models.DecimalField(max_digits=6,decimal_places=2)
    image = models.ImageField(default = 'default.jpg', upload_to = 'media/movie_posters')

    def __str__(self):
        return f'{self.title} Info'

    def save(self, *args, **kwargs):
        super(Movie, self).save(*args, **kwargs)

        image = Image.open(self.image.path)

        if image.height > 200 or image.width > 200:
            output_size = (200, 200)
            image.thumbnail(output_size)
            image.save(self.image.path)

Here is my views.py:

from django.shortcuts import render
from .models import Movie,TimeSlot


pagetitle = 'Order Tickets Online'

def home(request):
    context = {
        'movielist': Movie.objects.all(),
        'timeslot': TimeSlot.objects.all(),
        'title': pagetitle
    }
    return render(request, 'movies/home.html', context)

def about(request):
    return render(request, 'movies/about.html')

And here is my home.html template:


{% block content %}

{% for movie in movielist %}

     <article class="media content-section">
       <div class="media-body">
         <div class="article-metadata">
           <a class="mr-2" href="#" style="font-size: 30px"> {{ movie.title}}</a>
           <small class="text-muted" >Showing on: {{ movie.release_date }}</small>
         </div>
         <img src="{{movie.image.url}}" alt="">
         <p class="article-content">
              <strong>Movie Description: </strong>{{ movie.description }} <br>
              <strong>Genre: </strong>{{ movie.genre }} <br>
              <strong>Time Slots: </strong><br>
              <strong>Available Seats: </strong>{{ movie.available_seats }} <br>
              <strong>ticket_price: </strong>{{ movie.ticket_price }} <br>
         </p>
       </div>
     </article>

{% endfor %}


{% endblock %}

Anyone who can guide me until this thing works? Newbie in python here, thanks!

Here is what it looks like inside my django administrator and under Movie app:

And inside the Time slots table here are the data:

when i click the title:

Here is what it looks like inside the Movie table:

解决方案

If you look at the many-to-many example in the docs, you could access to time slots using movie_instance.time_slot.all().

In your view you could omit the TimeSlot queryset:

def home(request):
    context = {
        'movielist': Movie.objects.all(),
        'title': pagetitle
    }
    for m in context['movielist']:    # for debug, remove later
        print(m.time_slot.all())      # for debug, remove later
    return render(request, 'movies/home.html', context)

And in your template you can try

<strong>Time Slots:</strong>
{% for t in movie.time_slot.all %}
    {{ t.timeslot1 }}
    {{ t.timeslot2 }}
    ...
{% endfor %}


Or you could add a method to your model to filter and prepare a string with what you need and then just call that method in your template for each movie instance.

class Movie(models.Model):
    def get_monday_time_slots(self):
        return self.time_slot.filter(day='monday')

Does that help?

这篇关于如何获取表中的整行并将其显示在模板中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆