进一步的改进

紧接上文,之前我们已经实现了获取app,并且用模板显示app,其实网站的整体结构已经算是搭建出来了,你已经可以在本地访问一个完整的网站,并且可以很方便的通过admin后台管理你的网站,增删改你的内容。但是这还是不够的。就先假设我们做的是一个静态的个人博客,除了文章的详情页,我们至少要有一个文章的列表来让别人看看我们到底写了什么东西。

文章列表页面

那就让我们先来写一个文章列表页面吧,首先一样的让我们先来写方法:

def article_list(request):
    articles = Article.object.all()
    #获取全部的Article
    context = {}
    context['list'] = articles
    return render(request,'你的文章列表html模板',context)

然后一样的创建html模板文件,这里我们要用到循环来遍历每个文章的标题。

{% for article in list %}  

{{list.title}}

{% endfor %}

当然我们还希望点击标题就可以直接跳转到文章页面,那么我们就肯定要使用a标签:

{% for article in list %}  
  {{article.title}}  
{% endfor %} 

最后再在urls把使用这个方法的url写好就可以了,这一步就不再写了。

后台定制

在默认情况下,我们的后台界面中article现实的是Article Object(id),只有再次点击我们才能看到标题和内容,很不方便。我们可以定制app显示的样式,让我们能一眼看出是哪篇文章。

方法一:在models.py下定义一个方法:

def __str__(self):
   return '%s' % self.title

但是不推荐这样做,因为这样实际上是为了区分不同的app,在之后多个app相互引用时更加方便。

方法二:在admin.py中创建新类并注册:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id','title','content')
    ording = ('-id',)
    #以id排序,-代表倒序
admin.site.register(Article,ArticleAdmin)

修改模型

在我们的article这一模型中,我们只有title和content两个属性,如果这时我们想要增加一个属性比如author之类的,我们就必须要修改我们的模型。其实修改模型只需要在模型里面修改就可以了,不过为了保持数据库的一些要求,你必须设置默认值,因为sqlite3不允许空值。最直接的默认值设定就是default=某个值,不过也有一些其他的方法来获得默认值。具体的方法可以在这里寻找:https://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html

在修改了模型之后,你需要在admin.py的ArticleAdmin类中添加显示的属性,如果你不需要显示的话也可以不加。但是你必须进行数据库迁移的操作,模型才会被改变。

如果你需要添加的属性来自其他模型,比如说你的author其实是来自于user这个模型里的,这个属性就被叫做外键(来自外部表(模型)的键(属性))。在引入外键的时候,你必须先引入那个被引用的模型,在设置属性的域时,你必须用models.ForeignKey的方法设置。如果你不想要删除某个属性的时候导致被引用的模型被更改,你需要设置删除时的限制:on_delete = models.DO_NOTHING。(如果你想要一同删除的话,你应该设置为级联CASCADE)

from django.contrib.auth.models import User

class Article(models.Model):
    ...
    author = models.ForeignKey(User,on_delete = models.DO_NOTHING,default = 1)

过滤器

在显示属性时,我们有时想要不同的显示格式,比如在list页面中,如果content太长,就无法很好的显示完整的文章列表;或者在显示时间时,我们不想要具体到时分秒,只要具体到天就可以。我们如何在不更改后台数据的情况下获得不同的显示效果呢?这时我们就要使用过滤器。

过滤器是跟随在元素之后的,两者中间用|隔开,形如:

{{ article.content | truncatechars:100 }}

常用的过滤器可以在这里查看:https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#built-in-filter-reference。这里留一部分之后在具体写

前端页面

模板嵌套

在一个设计风格较为统一的网站中,必然有很多组件是可以重复使用的。比如很多网站有顶部的导航栏,这个导航栏在每个页面都会出现。这时如果我们每次都要重复写一遍就会浪费很多时间。如果可以有一个总的html模板让我们作为一级模板,然后我们再去设计每个页面的具体模板就好了。实际上Django是支持这样做的。

首先我们需要线制作总的html,那么我们怎么读取分html中的内容呢?换句话说怎么把总html里面的坑用分html里面的内容填入呢?这时我们就要用

{{% block name %}}{{% endblock %}}
```

来实现。这里面的block实际上也是一种过滤器,然后name是我们自己规定的,是为了在有多个block时让内容知道自己要去哪里。

接下来我们要在分的html使用总的html。首先

```
{{%extends '总.html'%}}
```

引入总html。然后再在每个block里面写入你想要填入的内容即可,比如:

```html
{{% block title %}}我的个人博客{{% endblock %}}

这样我们就完成了模板的嵌套。

顺便一提,有一些模板不是只为一个app使用的,而是整个网站都在使用的,这时候我们需要在根目录下建立一个templates来存放公用的模板。我们需要在settings.py中找到DIRS(我们在(1)中已经讲过,就是在这里用的),然后把templates文件夹的路径写进去。仔细观察我们会发现settings里面已经给我们设置了基本路径BASE_DIR,也就是我们的项目文件夹,所以我们只需要这样写就可以了:

DIRS=[
    os.path.join(BASE_DIR,'templates')
]

使用css

我们已经制作好了基本的html,但是实在是太简陋了(这里提一个事情,我昨天上课老师给我们分享了之前参加中国软件杯的作品,有一个一等奖作品做的真的很好,就是因为页面太丑了没有得特等奖…),所以我们需要用css对其进行美化。

内联式的css就不说了,在html中用一个style标签包裹的css也是一样的。如果是外部独立的css文件要怎么让我们的html找到呢?建议现在根目录下新建一个static(静态)文件夹,下面用来存放css、js等文件。再在static下新建css,再把css文件存入其中。

我们要在settings.py下面增加来让Django找到我们的静态文件

STATICFILES_DIRS=[
    os/path.join(BASE_DIR,'static')
]

找的时候用:

<link rel='stylesheet' href='/static/name.css'>

顺便这里记录一个简单的全局居中方法

.class {
    position:absolute;
    left:50%;
    right:50%;
    transform:(-50%,-50%);
}

这一章就这样了,内容不是很多(主要是因为上一章太多了),下一章可能会着重讲bootstrap的各方面的使用,也可能不太管前端,继续推进网站建设的内容。


web      -前端

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Django学习笔记(1) 下一篇