Рубрики
Без рубрики

Динамически созданные предложения в Python/Django (Madlibs)

Это совершенно другой тип блога от всех других, которые у нас были раньше. Instea … Tagged с Python, Django.

Это совершенно другой тип блога от всех других, которые у нас были раньше. Вместо того, чтобы сосредоточиться на недавних выпусках СМИ, этот пост будет очень занужденным и уделять тому, как часть нового Еженедельные лучшие выборы Страница работает. Осторожность: Python/Django Code впереди!

На еженедельной странице Top Picks перечислены 3 лучших выпусках недели в каждой категории на основе их рейтингов. Каждый раздел средств массовой информации (книги, театральные фильмы, лучи Blu, альбомы) содержит динамически сгенерированный параграф. Я опишу, как это работает ниже.

Мы имеем дело с тремя типами моделей Django: книги, фильма и альбома. Модели немного сложнее, чем показаны здесь Но я стараюсь сделать это просто.

Класс фильма

class Movie(models.Model):
    """
    Movie class
    """

    # Fields
    title = models.CharField(max_length=100, help_text="Enter title")
    release_date = models.DateField()
    bluray_date = models.DateField(null=True, blank=True)
    poster = models.CharField(max_length=200, help_text="Enter poster file")
    overview = models.TextField(help_text="Enter overview")
    genre = models.ManyToManyField(MovieGenre, help_text="Select a genre for this movie")
    mpaa_rating = models.CharField(max_length=10, help_text="MPAA Rating") #details call
    run_time = models.IntegerField()
    slug = models.SlugField(max_length=100, null=True, blank=True)
    rating = models.IntegerField(default=60)
    trailer = models.CharField(max_length=100, help_text="Enter trailer link")
    director = models.CharField(max_length=100, blank=True, help_text="Enter director")
    theater_link = models.CharField(max_length=255, null=True, blank=True, help_text="Enter theater link")
    bluray_link = models.CharField(max_length=255, null=True, blank=True, help_text="Enter blu-ray link")
    votes = models.IntegerField(default=0)
    num_ratings = models.IntegerField(default=0)
    running_total = models.IntegerField(default=0)
    weighted_rating = models.IntegerField(default=0)

Класс альбомов

class Album(models.Model):
    """
    Album class
    """

    # Fields
    artist = models.CharField(max_length=100, help_text="Enter artist")
    title = models.CharField(max_length=100, help_text="Enter title")
    image = models.CharField(max_length=100, help_text="Enter image file")
    big_image = models.CharField(max_length=100, help_text="Enter image file")
    release_date = models.DateField()
    record_type = models.CharField(max_length=25, help_text="Enter record type")
    slug = models.SlugField(max_length=100, null=True, blank=True)
    length = models.IntegerField() #in seconds
    link = models.CharField(max_length=255, blank=True, help_text="Enter purchase link")
    genre = models.ManyToManyField(AlbumGenre, blank=True, help_text="Select a genre for this album")
    base_rating = models.IntegerField(default=60)
    votes = models.IntegerField(default=0)
    num_ratings = models.IntegerField(default=0)
    running_total = models.IntegerField(default=0)
    weighted_rating = models.IntegerField(default=0)

Книжный класс

class Book(models.Model):
    """
    Book class
    """

    # Fields
    title = models.CharField(max_length=150, help_text="Enter title")
    cover_image = models.CharField(max_length=200, help_text="Enter image file")
    description = models.TextField(help_text="Enter description")
    author = models.CharField(max_length=100, help_text="Enter author")
    pages = models.IntegerField()
    release_date = models.DateField()
    genre = models.ManyToManyField(BookGenre, help_text="Select a genre for this book")
    slug = models.SlugField(max_length=100, null=True, blank=True)
    rating = models.IntegerField(default=60)
    votes = models.IntegerField(default=0)
    link = models.CharField(max_length=255, blank=True, help_text="Enter purchase link")
    num_ratings = models.IntegerField(default=0)
    running_total = models.IntegerField(default=0)
    weighted_rating = models.IntegerField(default=0)

Затем нам нужен метод утилиты, чтобы получить диапазон дат на эту неделю. Мы получаем сегодняшнее свидание, а затем выясняем день недели, когда воскресенье составляет 0, а суббота – 6. Мы используем эту информацию, чтобы выяснить неделю в воскресенье и субботу, которые соответствуют нашим датам начала и окончания. Перейдите назад начало и окончания!

def getThisWeekStartEnd():
    """
    return Sunday's and Saturday's datetime object for the current week
    """

    today = datetime.today().strftime("%Y-%m-%d")

    d1 = datetime.strptime(today, "%Y-%m-%d")
    day_of_week = d1.weekday()

    if day_of_week == 0:
        start_date = d1 + timedelta(days=-1)
        end_date = d1 + timedelta(days=5)
    elif day_of_week == 1:
        start_date = d1 + timedelta(days=-2)
        end_date = d1 + timedelta(days=4)
    elif day_of_week == 2:
        start_date = d1 + timedelta(days=-3)
        end_date = d1 + timedelta(days=3)
    elif day_of_week == 3:
        start_date = d1 + timedelta(days=-4)
        end_date = d1 + timedelta(days=2)
    elif day_of_week == 4:
        start_date = d1 + timedelta(days=-5)
        end_date = d1 + timedelta(days=1)
    elif day_of_week == 5:
        start_date = d1 + timedelta(days=-6)
        end_date = d1
    elif day_of_week == 6:
        start_date = d1
        end_date = d1 + timedelta(days=6)

    return start_date, end_date

Теперь, когда у нас есть наши даты начала и окончания, давайте напишем нашу функцию Views.py, чтобы запросить наши данные. Мы начнем с того, что называем нашу функцию, которую мы только что написали, чтобы получить даты начала и окончания. Далее мы запрашиваем 3 объекта книги, которые попадают в наш диапазон дат и упорядочены в порядке убывания (верхние результаты). Сделайте то же самое для объектов фильма и альбомов. Примечание: театральные релизы и лучи Blu – оба фильмы. В случае, если у нас нет данных для текущей недели, запрос данных на прошлой неделе. (Мы должны добавить запасную сторону, если это не вернет никаких данных, но это работает для наших целей.) У нас есть наши данные, поэтому создайте наши предложения … что мы сделаем ниже.

def top_picks(request):
    start_date, end_date = getThisWeekStartEnd()

    books = Book.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).order_by('-rating')[:3]
    theaters = Movie.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).filter(bluray_date__isnull=True).order_by('-rating')[:3]
    blurays = Movie.objects.filter(bluray_date__range=[start_date, end_date]).filter(active=True).filter(bluray_date__isnull=False).order_by('-rating')[:3]
    albums = Album.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).order_by('-base_rating')[:3]

    if len(books) == 0:
        books = Book.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).order_by('-rating')[:3]

    if len(theaters) == 0:
        theaters = Movie.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).filter(bluray_date__isnull=True).order_by('-rating')[:3]

    if len(blurays) == 0:
        blurays = Movie.objects.filter(bluray_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).filter(bluray_date__isnull=False).order_by('-rating')[:3]

    if len(albums) == 0:
        albums = Album.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).order_by('-base_rating')[:3]

    books_text = build_book_sentences(books)
    theaters_text = build_movie_sentences(theaters)
    blurays_text = build_movie_sentences(blurays)
    albums_text = build_album_sentences(albums)

    return render(
        request,
        'top_picks.html',
        context={
            'books':books,
            'books_text':books_text,
            'theaters':theaters,
            'theaters_text':theaters_text,
            'blurays':blurays,
            'blurays_text':blurays_text,
            'albums':albums,
            'albums_text':albums_text
        },
    )

Большой! У нас есть наши объекты данных, поэтому давайте создадим наши динамически сгенерированные предложения. Мы создадим три функции, которые похожи: одна для книг, одна для фильмов и одна для альбомов. Все трое работают одинаково … Создайте список прилагательных, список действий и динамически назначайте их, когда мы зацикливаемся на наших медиа -объектах. Затем мы применяем наши переменные к случайно выбранной структуре предложения. Наконец, объедините предложения вместе и передайте их обратно.

def build_book_sentences(books):
    sentences = ''
    adjectives = ['exciting', 'finely crafted', 'inventive', 'fresh', 'vivid', 'mesmerizing', 'imaginative']
    actions = [
        "invents a spellbinding world that draws you in. ",
        "grabs you and doesn't let go until you've read the last page. ",
        "paints a literary picture that makes you feel as though you're right there in the action. ",
        "presents a new take on a familiar genre with a page-turning style. ",
        "demands you curl up in a comfy chair and keep reading until the very last word. "
    ]

    used_adj = []
    used_action = []

    for book in books:
        sel_adj = random.choice(adjectives)
        sel_action = random.choice(actions)

        while sel_adj in used_adj or sel_action in used_action:
            sel_adj = random.choice(adjectives)
            sel_action = random.choice(actions)

        used_adj.append(sel_adj)
        used_action.append(sel_action)

        genre = book.genre.first().name.lower().replace('&', 'and')

        structure = [
            "{}'s {} new {} book, {}, {}".format(book.author, sel_adj, genre, book.title, sel_action),
            "In the {} {} book, {}, {} {}".format(sel_adj, genre, book.title, book.author, sel_action)
        ]

        sel_struct = random.choice(structure)
        sentences = sentences + sel_struct

    return sentences
def build_movie_sentences(movies):
    sentences = ''
    adjectives = ['exciting', 'finely crafted', 'inventive', 'fresh', 'vivid', 'mesmerizing', 'imaginative']
    actions = [
        "invents a spellbinding world that draws you in. ",
        "grabs you and doesn't let go until you've watched the credits roll. ",
        "paints a cinematic picture that makes you feel as though you're right there in the action. ",
        "presents a new take on a familiar genre with a fascinating style. ",
        "demands you perch on the edge of your seat and keep watching until the very last scene. "
    ]

    used_adj = []
    used_action = []

    for movie in movies:
        sel_adj = random.choice(adjectives)
        sel_action = random.choice(actions)

        while sel_adj in used_adj or sel_action in used_action:
            sel_adj = random.choice(adjectives)
            sel_action = random.choice(actions)

        used_adj.append(sel_adj)
        used_action.append(sel_action)

        genre = movie.genre.first().name.lower().replace('&', 'and')

        structure = [
            "{}'s {} new {} movie, {}, {}".format(movie.director, sel_adj, genre, movie.title, sel_action),
            "In the {} {} movie, {}, {} {}".format(sel_adj, genre, movie.title, movie.director, sel_action)
        ]

        sel_struct = random.choice(structure)
        sentences = sentences + sel_struct

    return sentences
def build_album_sentences(albums):
    sentences = ''
    adjectives = ['exciting', 'finely crafted', 'inventive', 'fresh', 'vivid', 'mesmerizing', 'imaginative']
    actions = [
        "casts a musical spell that draws you in. ",
        "grabs you by the ears and doesn't let go until last note. ",
        "paints a auditory picture that makes you feel as though you're right there on stage. ",
        "presents a new take on a familiar genre with a captivating style. ",
        "demands you crank the stereo to 11 and keep dancing until the very last track. "
    ]

    used_adj = []
    used_action = []

    for album in albums:
        sel_adj = random.choice(adjectives)
        sel_action = random.choice(actions)

        while sel_adj in used_adj or sel_action in used_action:
            sel_adj = random.choice(adjectives)
            sel_action = random.choice(actions)

        used_adj.append(sel_adj)
        used_action.append(sel_action)

        genre = album.genre.first().name.lower().replace('&', 'and')

        structure = [
            "{}'s {} new {} album, {}, {}".format(album.artist, sel_adj, genre, album.title, sel_action),
            "In the {} {} album, {}, {} {}".format(sel_adj, genre, album.title, album.artist, sel_action)
        ]

        sel_struct = random.choice(structure)
        sentences = sentences + sel_struct

    return sentences

Наш последний шаг – передать наши данные в наш шаблон Django, который мы не будем здесь охватить. Проверьте наш Заполненная страница Анкет

Оригинал: “https://dev.to/iceorfiresite/dynamically-created-sentences-in-python-django-madlibs-4l71”