Django关系数据库在视图中

时间:2014-04-24 13:05:13

标签: python django templates

我有一个django应用程序,我有很多很多字段,我试图在我的列表中显示这些关系记录,但它都是空白的

所以这是我的模特:

class Genre(models.Model):
    genre_name = models.CharField(max_length=50)
    genre_slug = models.SlugField(max_length=300)
    genre_meta = models.TextField(max_length=300)
    genre_description = models.TextField(max_length=300)
    listing = models.BooleanField(default=True)

    def __unicode__(self):
        return self.genre_name

class Movie(models.Model):
    movie_name = models.CharField(max_length=50)
    movie_slug = models.SlugField(max_length=300)
    movie_description = models.TextField(null=True, max_length=300)
    movie_category = models.ManyToManyField(Category, related_name='category')
    movie_genre = models.ManyToManyField(Genre, blank=True, related_name='genre')
    listing = models.BooleanField(default=True)

    def __unicode__(self):
        return self.movie_name

这是我的观点

def AllMovies (request):
    movies= Movie.objects.all().order_by('movie_name')
    context = {'movies': movies}
    return render_to_response('all.html', context, context_instance=
RequestContext(request))                 

这是我的模板

 {% for movie in movies %}
<a href="/movies/{{ movie.movie_slug }}/">{{ movie }}</a>
{% for genre in movies.genre.all %}{{ genre_name }}{% endfor %}

{% endfor %}

所以这里有三个问题:

1-我得到的所有内容在我的模板中都是空白的

2-显示已列出的项目的最佳选项是什么,并将其余部分隐藏在模板中

3-这是一个数据库,所以我确定我们需要在我的模板中使用加载更多按钮,但如果我想显示30个项目而不是全部

1 个答案:

答案 0 :(得分:2)

试试这个:

{% for movie in movies %}
    <a href="/movies/{{ movie.movie_slug }}/">{{ movie }}</a>
    {% for genre in movie.movie_genre.all %}{{ genre_name }}{% endfor %}
{% endfor %}

你试图迭代movies.genre.all,这是错误的,因为:

  • movies是一个查询集,您应该使用movie,因为它是一个模型实例
  • genre不是电影模型中的字段,您应该使用movie_genre,这是您正在寻找的ManyToManyField

我相信你并不理解related_name属性。它不会修改字段的行为(在这种情况下:movie_genre)。相反,它会更改相关模型中属性的名称(在本例中为Genre)。例如,您可以使用它来获取所有相关电影:

>>> genre = Genre.objects.get(name='Drama')
>>> genre.genre.all()
[<Movie>, <Movie>, ...]

正如您所看到的,您对related_name的选择并不是那么好。像movies之类的东西会更合适。

请再次阅读文档,因为您可能没有理解Django关于关系的逻辑(外键,多对多等)。

此外,这里有一些与风格相关的提示: