Как получить всю строку в таблице и отобразить ее в шаблоне - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь создать сайт для продажи билетов в кинотеатр, в котором я учусь в школе, и я сделал две модели: 1 - Movie и 2 TimeSlot.Movie.time_slot имеет отношение manytomany к таблице TimeSlot.

То, что я хочу, это отобразить временной интервал для фильма в зависимости от Movie.title и от того, что day это.

Например, я хочу, чтобы в строке Time Slots: ниже отображалось:

Понедельник: timeslot1.value, timeslot2.value, timeslot3.value, timeslot4.value

.что текущий день Monday и timeslots выше не были empty или null

enter image description here

Вот мой 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)

Вот мой 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')

А вот мой шаблон home.html:


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

Любой, кто может вести меня до этоговещь работает?Новичок в Python здесь, спасибо!

Вот как это выглядит внутри моего django administrator и под Movie приложения: enter image description here

И внутри Time slots В таблице приведены данные: enter image description here

при нажатии на заголовок: enter image description here

Вот как это выглядитвнутри таблицы фильмов:

enter image description here

1 Ответ

0 голосов
/ 04 апреля 2019

Если вы посмотрите на пример «многие ко многим» в документах , вы можете получить доступ к временным интервалам, используя movie_instance.time_slot.all().

С вашей точки зрения вы можете опустить 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)

И в вашем шаблоне вы можете попробовать

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

Или вы можете добавить метод к вашей модели для фильтрации и подготовки строки с тем, что вам нужноа затем просто вызовите этот метод в шаблоне для каждого экземпляра фильма.

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

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...