<commit_before>文章分类及侧边栏
====

通过前面的操作，我们的博客已具备了内容的添加与展示了，但离一个可以使用成品还是有断距离的，下面我们为博客添加侧边栏，页面，讨论等功能。

## 文章分类
这个分类，我们添加到`blog.models`中：

```python
class Category(models.Model):
    name = models.CharField(u'文章分类', max_length=64)

    class Meta:
        ordering = ['-id']

    def __unicode__(self):
        return self.name

```

这`Category`关联到`Post`中：

```python
	...
    po_type = models.ForeignKey(Category, verbose_name=u'文章分类', blank=True, null=True)
	...
```

使用south同步数据

```python
$ ./manage.py schemamigration blog --auto
 + Added model blog.Category
 + Added field po_type on blog.Post
Created 0002_auto__add_category__add_field_post_po_type.py. You can now apply this migration with: ./manage.py migrate blog

$ ./manage.py migrate blog
Running migrations for blog:
 - Migrating forwards to 0002_auto__add_category__add_field_post_po_type.
 > blog:0002_auto__add_category__add_field_post_po_type
 - Loading initial data for blog.
Installed 0 object(s) from 0 fixture(s)

```

同样，我们需要将`Category`也注册到Admin中，操作方法与`Post`类似：

```
# ...
from blog.models import Category
# ...
admin.site.register(Category)
```

完成这一步之后，我们就能在`admin`后台添加分类，并将文章归入相应的分类了。

## 侧边栏
我们平时看到的博客，一般侧边栏会放一些个人个信息，文章分类列表，一个登录入口之类的。所有页面的侧边栏都一样的，我们现在两个`views`，一个是首页的文章列表，一个是文章详细内容。于是我们可以考虑将这部份内容抽取出来，然后使用Django模块的`include`，引入到需要的模块中去。下面是我们的侧边栏代码：

```html
<div class="panel panel-default">
  <div class="panel-body">
    <h3>关于</h3>
    <p>这是我的个人博客，它是使用Django开发的</p>
 </div>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <h3>文章分类</h3>
    {% if categories %}
    <ul class="list-unstyled">
    {% for c in categories %}
      <li>- {{ c.name|safe }}</li>
    {% endfor %}
    </ul>
    {% endif %}
</div>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <h3>登录入口</h3><commit_msg>Update 03.9.md<commit_after>文章分类及侧边栏
====

通过前面的操作，我们的博客已具备了内容的添加与展示了，但离一个可以使用成品还是有断距离的，下面我们为博客添加侧边栏，页面，讨论等功能。

## 文章分类
这个分类，我们添加到`blog.models`中：

```python
class Category(models.Model):
    name = models.CharField(u'文章分类', max_length=64)

    class Meta:
        ordering = ['-id']

    def __unicode__(self):
        return self.name

```

这`Category`关联到`Post`中：

```python
	...
    po_type = models.ForeignKey(Category, verbose_name=u'文章分类', blank=True, null=True)
	...
```

使用south同步数据

```python
$ ./manage.py schemamigration blog --auto
 + Added model blog.Category
 + Added field po_type on blog.Post
Created 0002_auto__add_category__add_field_post_po_type.py. You can now apply this migration with: ./manage.py migrate blog

$ ./manage.py migrate blog
Running migrations for blog:
 - Migrating forwards to 0002_auto__add_category__add_field_post_po_type.
 > blog:0002_auto__add_category__add_field_post_po_type
 - Loading initial data for blog.
Installed 0 object(s) from 0 fixture(s)

```

同样，我们需要将`Category`也注册到Admin中，操作方法与`Post`类似：

```
# ...
from blog.models import Category
# ...
admin.site.register(Category)
```

完成这一步之后，我们就能在`admin`后台添加分类，并将文章归入相应的分类了。

## 侧边栏
我们平时看到的博客，一般侧边栏会放一些个人个信息，文章分类列表，一个登录入口之类的。所有页面的侧边栏都一样的，我们现在两个`views`，一个是首页的文章列表，一个是文章详细内容。于是我们可以考虑将这部份内容抽取出来，然后使用Django模块的`include`，引入到需要的模块中去。下面是我们的侧边栏代码：

```html
<div class="panel panel-default">
  <div class="panel-body">
    <h3>关于</h3>
    <p>这是我的个人博客，它是使用Django开发的</p>
 </div>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <h3>文章分类</h3>
    {% if categories %}
    <ul class="list-unstyled">
    {% for c in categories %}
      <li>- {{ c.name }}</li>
    {% endfor %}
    </ul>
    {% endif %}
</div>
</div>

<div class="panel panel-default">
  <div class="panel-body">
    <h3>登录入口</h3>
{'fraction_non_alphanumeric': 0.1518600777345919, 'fraction_numerical': 0.013048306496390895, 'mean_word_length': 4.5430769230769235, 'pattern_counts': {'":': 0, '<': 47, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '862272', 'n_tokens_mistral': 1795, 'n_tokens_neox': 1814, 'n_words': 242}