Django 随机对象并在模板中使用

Django random object and use in template

首先,我是 Django 的新手。我的第一个项目是一个电影网络应用程序,模型如下:

class Movie(models.Model):
### movie database ###

def __str__(self):
    return self.name

def get_random(self):
    max_id = Movie.objects.all().aggregate(max_id=Max('id'))['max_id']

    while True:
        pk = random.randint(1, max_id)
        movie = Movie.objects.filter(pk=pk).first()
        if movie:
            return movie

这个"get_random"函数只给我1个return。我可以得到更多吗,比方说 10?

我在 "movies_index" 模板中使用了这个模型。 :

{% for movie in movies %}
<a href="{% url 'movies_detail' movie.get_random.pk %}">
<img src="{{ movie.get_random.poster }}" class="img-fluid">
{% endfor %}

网页可以显示带有超链接的电影海报。但是当我点击时,它会转到另一部电影。是的,因为我做了两次 "random",得到了 2 个不同的结果。

我的问题是:如何选择一组随机数并在我的场景中使用它的一致性?

顺便说一句,我使用的 CBV 如下:

class MoviesIndex(ListView):
    model = Movie
    context_object_name = 'movies'
    template_name = 'movies/movies_index.html'

如果您只想始终以随机顺序列出您的电影对象,您可以在检索查询集时简单地使用 .order_by('?')

覆盖 ListView 的 get_queryset 方法

class MoviesIndex(ListView):
    model = Movie
    context_object_name = 'movies'
    template_name = 'movies/movies_index.html'

    def get_queryset(self):
       return Movie.objects.order_by('?')

并在模板中删除 get_random

{% for movie in movies %}
   <a href="{% url 'movies_detail' movie.pk %}">
   <img src="{{ movie.poster }}" class="img-fluid">
{% endfor %}

或者,如果您仍想 get_random,则列出 movie 个对象的所有 ID

movie_pks = list(Movie.objects.values_list('id', flat=True))

并使用 random.choice 到 select 单个 pk

import random
print(random.choice(movie_pks))

Note: don't use random.randint in your case, because if an object of the movie is deleted then it will fail

此外,从 get_random 方法中删除 while True:,你不需要它,因为你总是会得到一个电影对象

@property
def get_random(self):
    movie_pks = list(Movie.objects.values_list('id', flat=True))
    pk = random.choice(movie_pks)
    movie = Movie.objects.get(pk=pk)
    return movie

并且不要在模板中调用 get_random 2 次使用 with

{% with rand_movie=movie.get_random %}
    <a href="{% url 'movies_detail' rand_movie.pk %}">
    <img src="{{ rand_movie.poster }}" class="img-fluid">
{% endwith %}