Django 高级编程之 Hello World
1. 创建项目
2. 创建 app
- Tools -> Run manage.py Task -> 输入 startapp message,message为 app名
- 在项目上新建四个目录,apps, log, media, static
- 将 Message 文件夹移到 apps中
- 将 apps 目录设置 mark as Sources root
- 在 settings.py 文件中添加:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps',
]
3. 配置数据库
3.1 安装 MySQL 驱动
如果安装 pymysql:
- 在 PyCharm 的 Terminal 中,pip install pymysql
- 在子级目录的__init__.py 中添加:
import pymysql
pymysql.install_as_MySQLdb()如果安装 mysqlclient:
- pip install mysqlclient
- 在 /usr/local/lib 目录中,ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib libmysqlclient.21.dylib
- 不需要修改 init.py
- pymysql 是一个纯 python 的包,比mysqlclient更慢,故建议安装 mysqlclient
3.2 配置数据库信息
- 在settings.py 文件中添加:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdjango',
'USER': 'root',
'PASSWORD': '***',
'HOST': '127.0.0.1'
}
}
3.3 创建实体类
在models.py 文件中创建UserMessage类,类似 Java 中创建的 ORM 框架:
class UserMessage(models.Model):
name = models.CharField(max_length=20, verbose_name=u'用户名')
email = models.EmailField(verbose_name=u'邮箱')
address = models.CharField(max_length=100, verbose_name=u'联系地址')
message = models.CharField(max_length=500, verbose_name=u'留言地址')
class Meta:
verbose_name = u'用户留言信息'
# 如果没有指定 verbose_name_plural 字段,那么就会在 verbose_name 字段信息的后面加一个 s
# 如果指定了,就会显示自定的信息
verbose_name_plural = verbose_name
# db_table = 'user_message'
# 按这个字段倒序排列
# ordering = '-object_id'
4. 配置静态文件
4.1 配置样式等文件
- 新建 static 文件夹,并将静态文件按照目录放到这个文件夹中,HTML 文件中也需要修改对应的路径
- settings.py 文件中添加:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
4.2 配置 HTML 文件
- 将 HTML 文件放到 template 文件夹下
- 配置 settings.py 文件,修改 TEMPLATE 的 DIRS 字段为:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- 注意点:HTML 文件中的各种连接都建议使用/开头,比如一个链接写成 href=’/link1’,而不要写成href=‘link1’,这样做的好处是:使用绝对路径,而不是使用相对路径,相对路径在多次相对之后就会让人产生混乱。通常开发中,都建议设置一个 BASE 绝对路径,其他路径都是基于此设置路径,但是也是使用绝对路径方式,不要使用…/…/这种方式。
5. 生成数据表等初始化操作
- Tools -> Run manage.py Task -> 输入 makemigrations 和 migrate
6. 启动
- Run -> Run ‘helloworld’ 或者 debug
7. 新建一个 form 表单
- form 表单中添加:{% csrf_token %}
- 在 url.py 中添加 action 对应的请求路径,通常都是使用正则表达式进行匹配,一个 action 一个匹配太冗余。配置匹配时,正则表达式需要加^ 和 $ 符号。
from apps.views import DemoView
from django.views.generic import TemplateView
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', TemplateView.as_view(template_name='index.html')),
url(r'^index/$', TemplateView.as_view(template_name='index.html')),
# 注意需要加^ 和 $ 符号,分别对应开始和结束,这里非常重要,配置不好会出现 URL 串联
url(r'^demo/$', DemoView.as_view(), name='demo_form'),
]
- 在 apps 的 views.py文件中新建DemoView类,新建demo_form方法
def demo_form(request):
if request.method == 'POST':
name = request.POST.get('name', '')
message = request.POST.get('message', '')
address = request.POST.get('address', '')
email = request.POST.get('email', '')
user_message = UserMessage()
user_message.name = name
user_message.message = message
user_message.address = address
user_message.email = email
user_message.save()
# 返回的message_form.html页面中便会有my_message对象,可以通过my_message.name去除name 字段值
return render(request, 'message_form.html', {
'my_message': message
})
8. 注意点
- 有的时候,CSS 等静态文件会被浏览器缓存,导致样式不对。比如同时调试两个项目,而访问两个项目的地址都是127.0.0.1:8000,静态文件都是 style.css,此时就会出现样式串联的现象,误以为 Django 的 static 目录配置有问题,此时只要清空浏览器的缓存即可。