我最近一直在创建一个Hackernews类型的克隆,并且在我的数据库布局和视图方面遇到了一些麻烦。
基本上,用户可以发布故事并为每个故事选择一个类别。这是我的模特:
models.py
class Category(models.Model):
category_name = models.CharField(max_length = 50)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
def __unicode__(self):
return self.category_name
class Meta:
verbose_name_plural = "categories"
class Story(models.Model):
title = models.CharField(max_length = 200)
url = models.URLField()
points = models.IntegerField(default = 1)
moderator = models.ForeignKey(User, related_name = 'moderated_stories')
category = models.ForeignKey(Category, related_name = 'categories')
voters = models.ManyToManyField(User, related_name = 'liked_stories')
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
@property
def domain(self):
return urlparse(self.url).netloc
def __unicode__(self):
return self.title
class Meta:
verbose_name_plural = "stories"
首先,我想确认这是应该如何规划的?
这导致了我的第二个问题。我想收集属于特定类别的所有故事并将其显示在各自的网址上(即localhost / engineering将显示工程类别中的所有故事)。
到目前为止,这是我的观点/网址。它所做的就是为数据库中的每个类别分配自己的URL。
url.py
url(r'^(?P<category_id>[0-9]+)/$', 'stories.views.category'),
views.py
def category(request, category_id=1):
template = 'stories/category.html'
category = Category.objects.get(id = category_id)
return render_to_response(template, {
'category': category
})
我可以添加哪些类别视图,以便收集所有具有相同类别的故事,以便在我的模板中显示?
道歉,如果事情没有意义,我只是Django的新手。
答案 0 :(得分:3)
是的,您也可以在模板中使用set
{/ 3}}:
{{ for cat_story in category.story_set.all }}
{{cat_story.title }}
{{cat_story.url }}
...
{{ endfor }}
更新:啊,您使用了reated_name
,那么您应该使用categories
代替story_set
。请尝试使用category.categories.all
代替category.story_set.all
。
{{ for cat_story in category.categories.all }}
{{cat_story.title }}
{{cat_story.url }}
...
{{ endfor }}
更新:是的,django数据库api在两个视图和模板中的使用情况几乎相同。您可以查看相关的reverse relation (related objects)
以上页面显示了以下示例:
class Publication(models.Model):
title = models.CharField(max_length=30)
class Article(models.Model):
headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication)
article1.publications.all()
publication2.article_set.all()
您可以在没有括号的模板中使用类似的语法
{{ for publication in article1.publications.all }}
{{ for article in publication2.article_set.all }}