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 %}
首先,我是 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 %}