活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

PyCharm与Django强强联手打造无缝开发体验从项目创建到部署全流程优化助力开发者轻松构建高质量Web应用

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-24 14:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言:PyCharm与Django的完美结合

PyCharm是由JetBrains开发的一款功能强大的Python集成开发环境(IDE),而Django则是Python世界中最受欢迎的Web框架之一。两者的结合为Web开发者提供了一个高效、便捷的开发环境,极大地提升了开发效率和代码质量。本文将详细介绍如何利用PyCharm和Django的强强联手,从项目创建到部署的全流程优化,帮助开发者轻松构建高质量的Web应用。

PyCharm与Django简介

PyCharm:Python开发的首选IDE

PyCharm是一款专为Python开发设计的集成开发环境,提供了智能代码编辑、代码分析、图形化调试器、集成测试器、版本控制系统集成等强大功能。PyCharm有两个版本:专业版和社区版。其中,专业版提供了对Web框架(包括Django)的全面支持,是开发Django应用的首选工具。

PyCharm的主要优势包括:

1. 智能代码编辑:提供代码补全、语法高亮、错误检查等功能。
2. 强大的调试工具:图形化调试器,支持断点、变量监视等。
3. 集成版本控制:支持Git、SVN等版本控制系统。
4. 数据库工具:内置数据库客户端,支持多种数据库。
5. Web框架支持:对Django、Flask等Web框架的全面支持。

Django:高效的Python Web框架

Django是一个高级的Python Web框架,遵循”DRY(Don’t Repeat Yourself)“原则,旨在快速开发和干净、实用的设计。Django的主要特点包括:

1. MTV架构:模型(Model)、模板(Template)、视图(View)的清晰分离。
2. ORM系统:强大的对象关系映射,简化数据库操作。
3. 自动管理界面:自动生成管理后台。
4. 内置安全功能:防止CSRF、XSS、SQL注入等常见攻击。
5. 丰富的生态系统:大量的第三方包和扩展。

在PyCharm中创建Django项目

安装必要的软件

在开始之前,确保已安装以下软件:

1. Python:Django需要Python环境,建议使用Python 3.6或更高版本。
2. PyCharm Professional:专业版提供了完整的Django支持。
3. Django:可以通过pip安装。

安装Django的命令:
  1. pip install django
复制代码

创建新的Django项目

在PyCharm中创建Django项目的步骤如下:

1. 打开PyCharm,选择”File” > “New Project”。
2. 在左侧选择”Django”。
3. 设置项目位置和名称。
4. 选择Python解释器。可以新建虚拟环境,推荐使用虚拟环境以隔离项目依赖。
5. 点击”Create”。

PyCharm将自动创建Django项目的基本结构,包括:
  1. myproject/
  2.     manage.py
  3.     myproject/
  4.         __init__.py
  5.         settings.py
  6.         urls.py
  7.         asgi.py
  8.         wsgi.py
复制代码

配置项目设置

创建项目后,需要进行一些基本配置:

1. 数据库设置:在settings.py中配置数据库连接。默认使用SQLite,适合开发环境。
  1. # settings.py
  2. DATABASES = {
  3.     'default': {
  4.         'ENGINE': 'django.db.backends.sqlite3',
  5.         'NAME': BASE_DIR / 'db.sqlite3',
  6.     }
  7. }
复制代码

对于生产环境,可以配置为PostgreSQL或MySQL:
  1. # PostgreSQL配置示例
  2. DATABASES = {
  3.     'default': {
  4.         'ENGINE': 'django.db.backends.postgresql',
  5.         'NAME': 'mydatabase',
  6.         'USER': 'mydatabaseuser',
  7.         'PASSWORD': 'mypassword',
  8.         'HOST': 'localhost',
  9.         'PORT': '5432',
  10.     }
  11. }
复制代码

1. 静态文件设置:配置静态文件的存储和访问路径。
  1. # settings.py
  2. STATIC_URL = '/static/'
  3. STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  4. STATICFILES_DIRS = [
  5.     os.path.join(BASE_DIR, 'static'),
  6. ]
复制代码

1. 模板设置:配置模板路径。
  1. # settings.py
  2. TEMPLATES = [
  3.     {
  4.         'BACKEND': 'django.template.backends.django.DjangoTemplates',
  5.         'DIRS': [os.path.join(BASE_DIR, 'templates')],
  6.         'APP_DIRS': True,
  7.         'OPTIONS': {
  8.             'context_processors': [
  9.                 'django.template.context_processors.debug',
  10.                 'django.template.context_processors.request',
  11.                 'django.contrib.auth.context_processors.auth',
  12.                 'django.contrib.messages.context_processors.messages',
  13.             ],
  14.         },
  15.     },
  16. ]
复制代码

在PyCharm中开发Django应用

创建Django应用

在Django项目中,应用是功能模块的集合。创建应用的步骤如下:

1. 在PyCharm底部的Terminal中运行命令:
  1. python manage.py startapp myapp
复制代码

1. 在settings.py中注册新创建的应用:
  1. # settings.py
  2. INSTALLED_APPS = [
  3.     'django.contrib.admin',
  4.     'django.contrib.auth',
  5.     'django.contrib.contenttypes',
  6.     'django.contrib.sessions',
  7.     'django.contrib.messages',
  8.     'django.contrib.staticfiles',
  9.     'myapp',  # 新添加的应用
  10. ]
复制代码

定义模型

模型是Django应用的数据结构,定义在models.py文件中。PyCharm提供了对模型定义的智能支持。
  1. # myapp/models.py
  2. from django.db import models
  3. from django.utils import timezone
  4. class Post(models.Model):
  5.     title = models.CharField(max_length=200)
  6.     content = models.TextField()
  7.     created_date = models.DateTimeField(default=timezone.now)
  8.     published_date = models.DateTimeField(blank=True, null=True)
  9.    
  10.     def publish(self):
  11.         self.published_date = timezone.now()
  12.         self.save()
  13.    
  14.     def __str__(self):
  15.         return self.title
  16. class Comment(models.Model):
  17.     post = models.ForeignKey('Post', on_delete=models.CASCADE, related_name='comments')
  18.     author = models.CharField(max_length=100)
  19.     text = models.TextField()
  20.     created_date = models.DateTimeField(default=timezone.now)
  21.     approved_comment = models.BooleanField(default=False)
  22.    
  23.     def approve(self):
  24.         self.approved_comment = True
  25.         self.save()
  26.    
  27.     def __str__(self):
  28.         return self.text
复制代码

定义模型后,需要创建并应用数据库迁移:
  1. python manage.py makemigrations
  2. python manage.py migrate
复制代码

PyCharm的数据库工具可以可视化管理数据库,查看表结构和数据。

创建视图

视图处理HTTP请求并返回响应。在PyCharm中,可以轻松创建和编辑视图。
  1. # myapp/views.py
  2. from django.shortcuts import render, get_object_or_404, redirect
  3. from django.utils import timezone
  4. from .models import Post, Comment
  5. from .forms import PostForm, CommentForm
  6. def post_list(request):
  7.     posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
  8.     return render(request, 'myapp/post_list.html', {'posts': posts})
  9. def post_detail(request, pk):
  10.     post = get_object_or_404(Post, pk=pk)
  11.     return render(request, 'myapp/post_detail.html', {'post': post})
  12. def post_new(request):
  13.     if request.method == "POST":
  14.         form = PostForm(request.POST)
  15.         if form.is_valid():
  16.             post = form.save(commit=False)
  17.             post.author = request.user
  18.             post.save()
  19.             return redirect('post_detail', pk=post.pk)
  20.     else:
  21.         form = PostForm()
  22.     return render(request, 'myapp/post_edit.html', {'form': form})
  23. def post_edit(request, pk):
  24.     post = get_object_or_404(Post, pk=pk)
  25.     if request.method == "POST":
  26.         form = PostForm(request.POST, instance=post)
  27.         if form.is_valid():
  28.             post = form.save(commit=False)
  29.             post.author = request.user
  30.             post.save()
  31.             return redirect('post_detail', pk=post.pk)
  32.     else:
  33.         form = PostForm(instance=post)
  34.     return render(request, 'myapp/post_edit.html', {'form': form})
复制代码

创建表单

Django提供了强大的表单处理功能。在PyCharm中,可以轻松创建和编辑表单类。
  1. # myapp/forms.py
  2. from django import forms
  3. from .models import Post, Comment
  4. class PostForm(forms.ModelForm):
  5.     class Meta:
  6.         model = Post
  7.         fields = ('title', 'content',)
  8. class CommentForm(forms.ModelForm):
  9.     class Meta:
  10.         model = Comment
  11.         fields = ('author', 'text',)
复制代码

配置URL

URL配置将URL映射到视图。在PyCharm中,可以轻松管理和编辑URL配置。
  1. # myproject/urls.py
  2. from django.contrib import admin
  3. from django.urls import path, include
  4. from django.conf import settings
  5. from django.conf.urls.static import static
  6. urlpatterns = [
  7.     path('admin/', admin.site.urls),
  8.     path('', include('myapp.urls')),
  9. ]
  10. if settings.DEBUG:
  11.     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码
  1. # myapp/urls.py
  2. from django.urls import path
  3. from . import views
  4. urlpatterns = [
  5.     path('', views.post_list, name='post_list'),
  6.     path('post/<int:pk>/', views.post_detail, name='post_detail'),
  7.     path('post/new/', views.post_new, name='post_new'),
  8.     path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
  9. ]
复制代码

创建模板

模板定义了页面的HTML结构。PyCharm提供了对Django模板的语法高亮和智能提示。
  1. <!-- myapp/templates/myapp/base.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <title>My Django Blog</title>
  6.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  7. </head>
  8. <body>
  9.     <div class="container">
  10.         <nav class="navbar navbar-expand-lg navbar-light bg-light">
  11.             <a class="navbar-brand" href="{% url 'post_list' %}">Django Blog</a>
  12.             <div class="collapse navbar-collapse">
  13.                 <ul class="navbar-nav mr-auto">
  14.                     <li class="nav-item">
  15.                         <a class="nav-link" href="{% url 'post_new' %}">New Post</a>
  16.                     </li>
  17.                 </ul>
  18.             </div>
  19.         </nav>
  20.         <div class="content">
  21.             {% block content %}
  22.             {% endblock %}
  23.         </div>
  24.     </div>
  25. </body>
  26. </html>
复制代码
  1. <!-- myapp/templates/myapp/post_list.html -->
  2. {% extends 'myapp/base.html' %}
  3. {% block content %}
  4.     <h1>Blog Posts</h1>
  5.     {% for post in posts %}
  6.         <div class="post">
  7.             <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
  8.             <p>Published: {{ post.published_date }}</p>
  9.             <p>{{ post.content|truncatewords:30 }}</p>
  10.         </div>
  11.     {% endfor %}
  12. {% endblock %}
复制代码

PyCharm中的Django开发优化技巧

使用PyCharm的代码智能功能

PyCharm提供了多种代码智能功能,可以大大提高Django开发效率:

1. 代码补全:PyCharm提供智能代码补全,包括Django模型字段、视图函数、模板标签等。
2. 快速导航:使用Ctrl + B(Windows/Linux)或Cmd + B(Mac)可以快速跳转到定义处。例如,从视图函数跳转到模板,或从模板标签跳转到定义。
3. 代码检查:PyCharm会实时检查代码中的错误和潜在问题,并提供建议。
4. 重构:支持重命名、提取方法、提取变量等重构操作,并自动更新相关引用。

代码补全:PyCharm提供智能代码补全,包括Django模型字段、视图函数、模板标签等。

快速导航:使用Ctrl + B(Windows/Linux)或Cmd + B(Mac)可以快速跳转到定义处。例如,从视图函数跳转到模板,或从模板标签跳转到定义。

代码检查:PyCharm会实时检查代码中的错误和潜在问题,并提供建议。

重构:支持重命名、提取方法、提取变量等重构操作,并自动更新相关引用。

使用PyCharm的调试工具

PyCharm提供了强大的调试工具,可以帮助开发者快速定位和解决问题:

1. 设置断点:在代码行号旁边点击即可设置断点。
2. 启动调试:点击工具栏上的调试按钮或使用Shift + F9快捷键启动调试。
3. 变量监视:在调试过程中,可以监视变量的值,甚至修改变量值。
4. 表达式求值:在调试过程中,可以评估任意Python表达式的值。
5. Django模板调试:PyCharm支持Django模板的调试,可以在模板中设置断点。

设置断点:在代码行号旁边点击即可设置断点。

启动调试:点击工具栏上的调试按钮或使用Shift + F9快捷键启动调试。

变量监视:在调试过程中,可以监视变量的值,甚至修改变量值。

表达式求值:在调试过程中,可以评估任意Python表达式的值。

Django模板调试:PyCharm支持Django模板的调试,可以在模板中设置断点。

使用PyCharm的数据库工具

PyCharm内置了强大的数据库工具,可以方便地管理和操作数据库:

1. 数据库连接:在PyCharm中可以直接连接到数据库,无需使用外部工具。
2. SQL编辑器:提供SQL语法高亮、代码补全和执行功能。
3. 数据编辑:可以直接在PyCharm中编辑数据库表中的数据。
4. ER图:可以生成数据库的实体关系图,直观地查看表之间的关系。

数据库连接:在PyCharm中可以直接连接到数据库,无需使用外部工具。

SQL编辑器:提供SQL语法高亮、代码补全和执行功能。

数据编辑:可以直接在PyCharm中编辑数据库表中的数据。

ER图:可以生成数据库的实体关系图,直观地查看表之间的关系。

在PyCharm中调试和测试Django应用

配置Django服务器

在PyCharm中,可以配置和运行Django开发服务器:

1. 打开”Run” > “Edit Configurations”。
2. 点击”+“按钮,选择”Django Server”。
3. 配置服务器参数,如主机、端口等。
4. 点击”OK”保存配置。

现在,可以通过点击工具栏上的运行按钮或使用Shift + F10快捷键启动Django服务器。

创建和运行测试

测试是确保代码质量的重要手段。在PyCharm中,可以轻松创建和运行Django测试:

1. 创建测试:在tests.py文件中创建测试用例。
  1. # myapp/tests.py
  2. from django.test import TestCase
  3. from django.utils import timezone
  4. from django.urls import reverse
  5. from .models import Post
  6. class PostModelTest(TestCase):
  7.     def create_post(self, title="Test Post", content="Test Content"):
  8.         return Post.objects.create(title=title, content=content, created_date=timezone.now())
  9.    
  10.     def test_post_creation(self):
  11.         post = self.create_post()
  12.         self.assertTrue(isinstance(post, Post))
  13.         self.assertEqual(post.__str__(), post.title)
  14. class PostViewTest(TestCase):
  15.     def setUp(self):
  16.         self.post = Post.objects.create(title="Test Post", content="Test Content",
  17.                                       created_date=timezone.now(), published_date=timezone.now())
  18.    
  19.     def test_post_list_view(self):
  20.         url = reverse('post_list')
  21.         resp = self.client.get(url)
  22.         self.assertEqual(resp.status_code, 200)
  23.         self.assertIn(self.post.title, resp.content.decode())
  24.    
  25.     def test_post_detail_view(self):
  26.         url = reverse('post_detail', kwargs={'pk': self.post.pk})
  27.         resp = self.client.get(url)
  28.         self.assertEqual(resp.status_code, 200)
  29.         self.assertIn(self.post.title, resp.content.decode())
复制代码

1. 运行测试:右键点击tests.py文件,选择”Run ‘Unittests in tests’“或使用快捷键Ctrl + Shift + F10。
2. 查看测试结果:测试结果将显示在底部工具窗口中,包括通过的测试、失败的测试和错误信息。
3. 调试测试:可以像调试普通代码一样调试测试用例,快速定位问题。

运行测试:右键点击tests.py文件,选择”Run ‘Unittests in tests’“或使用快捷键Ctrl + Shift + F10。

查看测试结果:测试结果将显示在底部工具窗口中,包括通过的测试、失败的测试和错误信息。

调试测试:可以像调试普通代码一样调试测试用例,快速定位问题。

在PyCharm中部署Django应用

准备生产环境

部署Django应用到生产环境需要进行一些配置修改:

1. 修改设置:创建生产环境设置文件。
  1. # myproject/settings_production.py
  2. from .settings import *
  3. # SECURITY WARNING: don't run with debug turned on in production!
  4. DEBUG = False
  5. ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com']
  6. # Database
  7. # https://docs.djangoproject.com/en/3.1/ref/settings/#databases
  8. DATABASES = {
  9.     'default': {
  10.         'ENGINE': 'django.db.backends.postgresql',
  11.         'NAME': 'mydatabase',
  12.         'USER': 'mydatabaseuser',
  13.         'PASSWORD': 'mypassword',
  14.         'HOST': 'localhost',
  15.         'PORT': '5432',
  16.     }
  17. }
  18. # Static files (CSS, JavaScript, Images)
  19. # https://docs.djangoproject.com/en/3.1/howto/static-files/
  20. STATIC_ROOT = '/var/www/static/'
  21. MEDIA_ROOT = '/var/www/media/'
  22. # Security settings
  23. SECURE_SSL_REDIRECT = True
  24. SESSION_COOKIE_SECURE = True
  25. CSRF_COOKIE_SECURE = True
  26. SECURE_BROWSER_XSS_FILTER = True
  27. SECURE_CONTENT_TYPE_NOSNIFF = True
  28. X_FRAME_OPTIONS = 'DENY'
复制代码

1. 收集静态文件:
  1. python manage.py collectstatic --settings=myproject.settings_production
复制代码

使用PyCharm部署到远程服务器

PyCharm提供了多种部署选项,可以轻松将Django应用部署到远程服务器:

1. 配置远程服务器:打开”Tools” > “Deployment” > “Configuration”。点击”+“添加新的服务器配置。配置服务器类型(如SFTP、FTP等)、主机、端口、用户名和密码。配置本地和远程路径映射。
2. 打开”Tools” > “Deployment” > “Configuration”。
3. 点击”+“添加新的服务器配置。
4. 配置服务器类型(如SFTP、FTP等)、主机、端口、用户名和密码。
5. 配置本地和远程路径映射。
6. 部署文件:右键点击项目或特定文件,选择”Deployment” > “Upload to…“。或者使用”Tools” > “Deployment” > “Upload to…“。
7. 右键点击项目或特定文件,选择”Deployment” > “Upload to…“。
8. 或者使用”Tools” > “Deployment” > “Upload to…“。
9. 自动上传:在部署配置中,可以启用”Automatic Upload”选项。这样,当文件被修改时,PyCharm会自动上传到远程服务器。
10. 在部署配置中,可以启用”Automatic Upload”选项。
11. 这样,当文件被修改时,PyCharm会自动上传到远程服务器。

配置远程服务器:

• 打开”Tools” > “Deployment” > “Configuration”。
• 点击”+“添加新的服务器配置。
• 配置服务器类型(如SFTP、FTP等)、主机、端口、用户名和密码。
• 配置本地和远程路径映射。

部署文件:

• 右键点击项目或特定文件,选择”Deployment” > “Upload to…“。
• 或者使用”Tools” > “Deployment” > “Upload to…“。

自动上传:

• 在部署配置中,可以启用”Automatic Upload”选项。
• 这样,当文件被修改时,PyCharm会自动上传到远程服务器。

使用Docker部署Django应用

Docker可以简化Django应用的部署过程。在PyCharm中,可以轻松创建和管理Docker容器:

1. 创建Dockerfile:
  1. # Dockerfile
  2. FROM python:3.8
  3. ENV PYTHONUNBUFFERED 1
  4. RUN mkdir /code
  5. WORKDIR /code
  6. COPY requirements.txt /code/
  7. RUN pip install -r requirements.txt
  8. COPY . /code/
复制代码

1. 创建docker-compose.yml:
  1. # docker-compose.yml
  2. version: '3'
  3. services:
  4.   db:
  5.     image: postgres
  6.     environment:
  7.       POSTGRES_PASSWORD: mypassword
  8.       POSTGRES_DB: mydatabase
  9.       POSTGRES_USER: mydatabaseuser
  10.   web:
  11.     build: .
  12.     command: python manage.py runserver 0.0.0.0:8000
  13.     volumes:
  14.       - .:/code
  15.     ports:
  16.       - "8000:8000"
  17.     depends_on:
  18.       - db
复制代码

1. 在PyCharm中使用Docker:打开”Run” > “Edit Configurations”。点击”+“按钮,选择”Docker” > “Docker-compose”。选择docker-compose.yml文件。配置服务名称和命令。点击”OK”保存配置。
2. 打开”Run” > “Edit Configurations”。
3. 点击”+“按钮,选择”Docker” > “Docker-compose”。
4. 选择docker-compose.yml文件。
5. 配置服务名称和命令。
6. 点击”OK”保存配置。
7. 运行Docker容器:点击工具栏上的运行按钮或使用Shift + F10快捷键启动Docker容器。PyCharm将自动构建镜像并启动容器。
8. 点击工具栏上的运行按钮或使用Shift + F10快捷键启动Docker容器。
9. PyCharm将自动构建镜像并启动容器。

在PyCharm中使用Docker:

• 打开”Run” > “Edit Configurations”。
• 点击”+“按钮,选择”Docker” > “Docker-compose”。
• 选择docker-compose.yml文件。
• 配置服务名称和命令。
• 点击”OK”保存配置。

运行Docker容器:

• 点击工具栏上的运行按钮或使用Shift + F10快捷键启动Docker容器。
• PyCharm将自动构建镜像并启动容器。

使用Gunicorn和Nginx部署Django应用

在生产环境中,通常使用Gunicorn作为应用服务器,Nginx作为反向代理:

1. 安装Gunicorn:
  1. pip install gunicorn
复制代码

1. 创建Gunicorn配置文件:
  1. # gunicorn.conf.py
  2. bind = "0.0.0.0:8000"
  3. workers = 4
复制代码

1. 创建Nginx配置文件:
  1. # /etc/nginx/sites-available/myproject
  2. server {
  3.     listen 80;
  4.     server_name your-domain.com www.your-domain.com;
  5.     location /static/ {
  6.         root /var/www/static;
  7.     }
  8.     location /media/ {
  9.         root /var/www/media;
  10.     }
  11.     location / {
  12.         proxy_pass http://127.0.0.1:8000;
  13.         proxy_set_header Host $host;
  14.         proxy_set_header X-Real-IP $remote_addr;
  15.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  16.     }
  17. }
复制代码

1. 启用Nginx配置:
  1. sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
  2. sudo nginx -t
  3. sudo systemctl restart nginx
复制代码

1. 创建systemd服务文件:
  1. # /etc/systemd/system/gunicorn.service
  2. [Unit]
  3. Description=gunicorn daemon
  4. After=network.target
  5. [Service]
  6. User=www-data
  7. Group=www-data
  8. WorkingDirectory=/path/to/your/project
  9. ExecStart=/path/to/your/venv/bin/gunicorn --config gunicorn.conf.py myproject.wsgi:application
  10. [Install]
  11. WantedBy=multi-user.target
复制代码

1. 启动Gunicorn服务:
  1. sudo systemctl start gunicorn
  2. sudo systemctl enable gunicorn
复制代码

实际案例:构建一个博客应用

为了展示PyCharm和Django的强大功能,让我们通过构建一个简单的博客应用来实践上述知识。

创建项目和应用

首先,在PyCharm中创建一个新的Django项目,然后创建一个博客应用:
  1. python manage.py startapp blog
复制代码

在settings.py中注册应用:
  1. INSTALLED_APPS = [
  2.     'django.contrib.admin',
  3.     'django.contrib.auth',
  4.     'django.contrib.contenttypes',
  5.     'django.contrib.sessions',
  6.     'django.contrib.messages',
  7.     'django.contrib.staticfiles',
  8.     'blog',
  9. ]
复制代码

定义模型

定义博客文章和评论的模型:
  1. # blog/models.py
  2. from django.db import models
  3. from django.contrib.auth.models import User
  4. from django.utils import timezone
  5. class PublishedManager(models.Manager):
  6.     def get_queryset(self):
  7.         return super().get_queryset().filter(status='published')
  8. class Post(models.Model):
  9.     STATUS_CHOICES = (
  10.         ('draft', 'Draft'),
  11.         ('published', 'Published'),
  12.     )
  13.     title = models.CharField(max_length=250)
  14.     slug = models.SlugField(max_length=250, unique_for_date='publish')
  15.     author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
  16.     body = models.TextField()
  17.     publish = models.DateTimeField(default=timezone.now)
  18.     created = models.DateTimeField(auto_now_add=True)
  19.     updated = models.DateTimeField(auto_now=True)
  20.     status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
  21.    
  22.     objects = models.Manager()  # The default manager.
  23.     published = PublishedManager()  # Our custom manager.
  24.    
  25.     class Meta:
  26.         ordering = ('-publish',)
  27.    
  28.     def __str__(self):
  29.         return self.title
  30. class Comment(models.Model):
  31.     post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
  32.     name = models.CharField(max_length=80)
  33.     email = models.EmailField()
  34.     body = models.TextField()
  35.     created = models.DateTimeField(auto_now_add=True)
  36.     updated = models.DateTimeField(auto_now=True)
  37.     active = models.BooleanField(default=True)
  38.    
  39.     class Meta:
  40.         ordering = ('created',)
  41.    
  42.     def __str__(self):
  43.         return f'Comment by {self.name} on {self.post}'
复制代码

运行数据库迁移:
  1. python manage.py makemigrations
  2. python manage.py migrate
复制代码

创建视图

创建博客文章列表、详情和评论视图:
  1. # blog/views.py
  2. from django.shortcuts import render, get_object_or_404
  3. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  4. from .models import Post, Comment
  5. from .forms import CommentForm
  6. def post_list(request):
  7.     object_list = Post.published.all()
  8.     paginator = Paginator(object_list, 3)  # 3 posts in each page
  9.     page = request.GET.get('page')
  10.     try:
  11.         posts = paginator.page(page)
  12.     except PageNotAnInteger:
  13.         # If page is not an integer deliver the first page
  14.         posts = paginator.page(1)
  15.     except EmptyPage:
  16.         # If page is out of range deliver last page of results
  17.         posts = paginator.page(paginator.num_pages)
  18.     return render(request, 'blog/post/list.html', {'posts': posts})
  19. def post_detail(request, year, month, day, post):
  20.     post = get_object_or_404(Post, slug=post,
  21.                                    status='published',
  22.                                    publish__year=year,
  23.                                    publish__month=month,
  24.                                    publish__day=day)
  25.    
  26.     # List of active comments for this post
  27.     comments = post.comments.filter(active=True)
  28.    
  29.     new_comment = None
  30.    
  31.     if request.method == 'POST':
  32.         # A comment was posted
  33.         comment_form = CommentForm(data=request.POST)
  34.         if comment_form.is_valid():
  35.             # Create Comment object but don't save to database yet
  36.             new_comment = comment_form.save(commit=False)
  37.             # Assign the current post to the comment
  38.             new_comment.post = post
  39.             # Save the comment to the database
  40.             new_comment.save()
  41.     else:
  42.         comment_form = CommentForm()
  43.    
  44.     return render(request, 'blog/post/detail.html', {'post': post,
  45.                                                      'comments': comments,
  46.                                                      'new_comment': new_comment,
  47.                                                      'comment_form': comment_form})
复制代码

创建表单

创建评论表单:
  1. # blog/forms.py
  2. from django import forms
  3. from .models import Comment
  4. class CommentForm(forms.ModelForm):
  5.     class Meta:
  6.         model = Comment
  7.         fields = ('name', 'email', 'body')
复制代码

配置URL

配置博客应用的URL:
  1. # blog/urls.py
  2. from django.urls import path
  3. from . import views
  4. app_name = 'blog'
  5. urlpatterns = [
  6.     path('', views.post_list, name='post_list'),
  7.     path('<int:year>/<int:month>/<int:day>/<slug:post>/',
  8.          views.post_detail,
  9.          name='post_detail'),
  10. ]
复制代码

在项目的主URL配置中包含博客应用的URL:
  1. # myproject/urls.py
  2. from django.contrib import admin
  3. from django.urls import path, include
  4. from django.conf import settings
  5. from django.conf.urls.static import static
  6. urlpatterns = [
  7.     path('admin/', admin.site.urls),
  8.     path('blog/', include('blog.urls')),
  9. ]
  10. if settings.DEBUG:
  11.     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码

创建模板

创建博客文章列表和详情模板:
  1. <!-- blog/templates/blog/base.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <title>{% block title %}Django Blog{% endblock %}</title>
  6.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  7. </head>
  8. <body>
  9.     <div class="container">
  10.         <nav class="navbar navbar-expand-lg navbar-light bg-light">
  11.             <a class="navbar-brand" href="{% url 'blog:post_list' %}">Django Blog</a>
  12.             <div class="collapse navbar-collapse">
  13.                 <ul class="navbar-nav mr-auto">
  14.                     <li class="nav-item">
  15.                         <a class="nav-link" href="{% url 'admin:index' %}">Admin</a>
  16.                     </li>
  17.                 </ul>
  18.             </div>
  19.         </nav>
  20.         <div class="content">
  21.             {% block content %}
  22.             {% endblock %}
  23.         </div>
  24.     </div>
  25. </body>
  26. </html>
复制代码
  1. <!-- blog/templates/blog/post/list.html -->
  2. {% extends "blog/base.html" %}
  3. {% block title %}Django Blog{% endblock %}
  4. {% block content %}
  5.     <h1>Django Blog</h1>
  6.     {% for post in posts %}
  7.         <h2>
  8.             <a href="{{ post.get_absolute_url }}">
  9.                 {{ post.title }}
  10.             </a>
  11.         </h2>
  12.         <p class="date">
  13.             Published {{ post.publish }} by {{ post.author }}
  14.         </p>
  15.         {{ post.body|truncatewords:30|linebreaks }}
  16.     {% endfor %}
  17.    
  18.     {% include "pagination.html" with page=posts %}
  19. {% endblock %}
复制代码
  1. <!-- blog/templates/blog/post/detail.html -->
  2. {% extends "blog/base.html" %}
  3. {% block title %}{{ post.title }}{% endblock %}
  4. {% block content %}
  5.     <h1>{{ post.title }}</h1>
  6.     <div class="date">
  7.         Published {{ post.publish }} by {{ post.author }}
  8.     </div>
  9.     {{ post.body|linebreaks }}
  10.    
  11.     <hr>
  12.    
  13.     <h2>Comments</h2>
  14.     {% if new_comment %}
  15.         <div class="alert alert-success">
  16.             Your comment has been added.
  17.         </div>
  18.     {% endif %}
  19.     {% for comment in comments %}
  20.         <div class="comment">
  21.             <p class="info">
  22.                 Comment {{ forloop.counter }} by {{ comment.name }}
  23.                 {{ comment.created }}
  24.             </p>
  25.             {{ comment.body|linebreaks }}
  26.         </div>
  27.     {% empty %}
  28.         <p>There are no comments yet.</p>
  29.     {% endfor %}
  30.    
  31.     <h2>Add a new comment</h2>
  32.     <form action="." method="post">
  33.         {{ comment_form.as_p }}
  34.         {% csrf_token %}
  35.         <p><input type="submit" value="Add comment"></p>
  36.     </form>
  37. {% endblock %}
复制代码

注册模型到管理后台

将博客文章和评论模型注册到Django管理后台:
  1. # blog/admin.py
  2. from django.contrib import admin
  3. from .models import Post, Comment
  4. @admin.register(Post)
  5. class PostAdmin(admin.ModelAdmin):
  6.     list_display = ('title', 'slug', 'author', 'publish', 'status')
  7.     list_filter = ('status', 'created', 'publish', 'author')
  8.     search_fields = ('title', 'body')
  9.     prepopulated_fields = {'slug': ('title',)}
  10.     raw_id_fields = ('author',)
  11.     date_hierarchy = 'publish'
  12.     ordering = ('status', 'publish')
  13. @admin.register(Comment)
  14. class CommentAdmin(admin.ModelAdmin):
  15.     list_display = ('name', 'email', 'post', 'created', 'active')
  16.     list_filter = ('active', 'created', 'updated')
  17.     search_fields = ('name', 'email', 'body')
复制代码

运行项目

现在,可以运行项目并查看结果:
  1. python manage.py runserver
复制代码

访问http://127.0.0.1:8000/blog/查看博客文章列表。

总结:PyCharm与Django的强强联手

PyCharm和Django的结合为Python Web开发提供了一个强大、高效的开发环境。通过本文的介绍,我们可以看到:

1. 项目创建和配置:PyCharm提供了直观的界面来创建和配置Django项目,大大简化了项目初始化过程。
2. 代码开发:PyCharm的智能代码编辑、代码补全、错误检查等功能,使Django开发更加高效和准确。
3. 调试和测试:PyCharm提供了强大的调试工具和测试支持,帮助开发者快速定位和解决问题。
4. 数据库管理:PyCharm的数据库工具使数据库操作变得简单直观。
5. 版本控制:集成的版本控制系统使代码管理更加方便。
6. 部署优化:PyCharm提供了多种部署选项,包括远程服务器部署和Docker容器部署,简化了部署流程。

项目创建和配置:PyCharm提供了直观的界面来创建和配置Django项目,大大简化了项目初始化过程。

代码开发:PyCharm的智能代码编辑、代码补全、错误检查等功能,使Django开发更加高效和准确。

调试和测试:PyCharm提供了强大的调试工具和测试支持,帮助开发者快速定位和解决问题。

数据库管理:PyCharm的数据库工具使数据库操作变得简单直观。

版本控制:集成的版本控制系统使代码管理更加方便。

部署优化:PyCharm提供了多种部署选项,包括远程服务器部署和Docker容器部署,简化了部署流程。

通过这些功能,PyCharm和Django的强强联手,使开发者能够专注于业务逻辑,而不是繁琐的配置和部署工作,从而更轻松地构建高质量的Web应用。

无论是初学者还是经验丰富的开发者,都可以从PyCharm和Django的结合中受益,提高开发效率和代码质量。希望本文能够帮助读者更好地理解和使用PyCharm和Django,构建出更加优秀的Web应用。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则