代码之家  ›  专栏  ›  技术社区  ›  Nguyen Ma

django随机对象及其在模板中的使用

  •  0
  • Nguyen Ma  · 技术社区  · 6 年前

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

    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
    

    这个“随机”的功能只给我一个返回。我能得到更多吗,比如说10?

    我在我的“电影索引”模板中使用了这个模型。:

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

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

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

    顺便说一句,我正在使用CBV,如下所示:

    class MoviesIndex(ListView):
        model = Movie
        context_object_name = 'movies'
        template_name = 'movies/movies_index.html'
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Satendra    6 年前

    .order_by('?')

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

    movie

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

    random.choice pk

    import random
    print(random.choice(movie_pks))
    

    注: 不要使用 random.randint 在你的情况下,因为如果一个物体 如果电影被删除,它将失败

    此外,移除 while True: GETX随机 方法,您不需要它,因为您总是会得到一个电影对象

    @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
    

    不要打电话 GETX随机 模板使用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 %}