我有一个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个项目而不是全部
答案 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关于关系的逻辑(外键,多对多等)。
此外,这里有一些与风格相关的提示:
movie_
和genre_
前缀 - 例如很明显genre_name
是一个类型的名称,因为它是在Genre
模型中定义的