|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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的命令:
创建新的Django项目
在PyCharm中创建Django项目的步骤如下:
1. 打开PyCharm,选择”File” > “New Project”。
2. 在左侧选择”Django”。
3. 设置项目位置和名称。
4. 选择Python解释器。可以新建虚拟环境,推荐使用虚拟环境以隔离项目依赖。
5. 点击”Create”。
PyCharm将自动创建Django项目的基本结构,包括:
- myproject/
- manage.py
- myproject/
- __init__.py
- settings.py
- urls.py
- asgi.py
- wsgi.py
复制代码
配置项目设置
创建项目后,需要进行一些基本配置:
1. 数据库设置:在settings.py中配置数据库连接。默认使用SQLite,适合开发环境。
- # settings.py
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': BASE_DIR / 'db.sqlite3',
- }
- }
复制代码
对于生产环境,可以配置为PostgreSQL或MySQL:
- # PostgreSQL配置示例
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'mydatabase',
- 'USER': 'mydatabaseuser',
- 'PASSWORD': 'mypassword',
- 'HOST': 'localhost',
- 'PORT': '5432',
- }
- }
复制代码
1. 静态文件设置:配置静态文件的存储和访问路径。
- # settings.py
- STATIC_URL = '/static/'
- STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
- STATICFILES_DIRS = [
- os.path.join(BASE_DIR, 'static'),
- ]
复制代码
1. 模板设置:配置模板路径。
- # settings.py
- 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',
- ],
- },
- },
- ]
复制代码
在PyCharm中开发Django应用
创建Django应用
在Django项目中,应用是功能模块的集合。创建应用的步骤如下:
1. 在PyCharm底部的Terminal中运行命令:
- python manage.py startapp myapp
复制代码
1. 在settings.py中注册新创建的应用:
- # settings.py
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'myapp', # 新添加的应用
- ]
复制代码
定义模型
模型是Django应用的数据结构,定义在models.py文件中。PyCharm提供了对模型定义的智能支持。
- # myapp/models.py
- from django.db import models
- from django.utils import timezone
- class Post(models.Model):
- title = models.CharField(max_length=200)
- content = models.TextField()
- created_date = models.DateTimeField(default=timezone.now)
- published_date = models.DateTimeField(blank=True, null=True)
-
- def publish(self):
- self.published_date = timezone.now()
- self.save()
-
- def __str__(self):
- return self.title
- class Comment(models.Model):
- post = models.ForeignKey('Post', on_delete=models.CASCADE, related_name='comments')
- author = models.CharField(max_length=100)
- text = models.TextField()
- created_date = models.DateTimeField(default=timezone.now)
- approved_comment = models.BooleanField(default=False)
-
- def approve(self):
- self.approved_comment = True
- self.save()
-
- def __str__(self):
- return self.text
复制代码
定义模型后,需要创建并应用数据库迁移:
- python manage.py makemigrations
- python manage.py migrate
复制代码
PyCharm的数据库工具可以可视化管理数据库,查看表结构和数据。
创建视图
视图处理HTTP请求并返回响应。在PyCharm中,可以轻松创建和编辑视图。
- # myapp/views.py
- from django.shortcuts import render, get_object_or_404, redirect
- from django.utils import timezone
- from .models import Post, Comment
- from .forms import PostForm, CommentForm
- def post_list(request):
- posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
- return render(request, 'myapp/post_list.html', {'posts': posts})
- def post_detail(request, pk):
- post = get_object_or_404(Post, pk=pk)
- return render(request, 'myapp/post_detail.html', {'post': post})
- def post_new(request):
- if request.method == "POST":
- form = PostForm(request.POST)
- if form.is_valid():
- post = form.save(commit=False)
- post.author = request.user
- post.save()
- return redirect('post_detail', pk=post.pk)
- else:
- form = PostForm()
- return render(request, 'myapp/post_edit.html', {'form': form})
- def post_edit(request, pk):
- post = get_object_or_404(Post, pk=pk)
- if request.method == "POST":
- form = PostForm(request.POST, instance=post)
- if form.is_valid():
- post = form.save(commit=False)
- post.author = request.user
- post.save()
- return redirect('post_detail', pk=post.pk)
- else:
- form = PostForm(instance=post)
- return render(request, 'myapp/post_edit.html', {'form': form})
复制代码
创建表单
Django提供了强大的表单处理功能。在PyCharm中,可以轻松创建和编辑表单类。
- # myapp/forms.py
- from django import forms
- from .models import Post, Comment
- class PostForm(forms.ModelForm):
- class Meta:
- model = Post
- fields = ('title', 'content',)
- class CommentForm(forms.ModelForm):
- class Meta:
- model = Comment
- fields = ('author', 'text',)
复制代码
配置URL
URL配置将URL映射到视图。在PyCharm中,可以轻松管理和编辑URL配置。
- # myproject/urls.py
- from django.contrib import admin
- from django.urls import path, include
- from django.conf import settings
- from django.conf.urls.static import static
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('', include('myapp.urls')),
- ]
- if settings.DEBUG:
- urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码- # myapp/urls.py
- from django.urls import path
- from . import views
- urlpatterns = [
- path('', views.post_list, name='post_list'),
- path('post/<int:pk>/', views.post_detail, name='post_detail'),
- path('post/new/', views.post_new, name='post_new'),
- path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
- ]
复制代码
创建模板
模板定义了页面的HTML结构。PyCharm提供了对Django模板的语法高亮和智能提示。
- <!-- myapp/templates/myapp/base.html -->
- <!DOCTYPE html>
- <html>
- <head>
- <title>My Django Blog</title>
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
- </head>
- <body>
- <div class="container">
- <nav class="navbar navbar-expand-lg navbar-light bg-light">
- <a class="navbar-brand" href="{% url 'post_list' %}">Django Blog</a>
- <div class="collapse navbar-collapse">
- <ul class="navbar-nav mr-auto">
- <li class="nav-item">
- <a class="nav-link" href="{% url 'post_new' %}">New Post</a>
- </li>
- </ul>
- </div>
- </nav>
- <div class="content">
- {% block content %}
- {% endblock %}
- </div>
- </div>
- </body>
- </html>
复制代码- <!-- myapp/templates/myapp/post_list.html -->
- {% extends 'myapp/base.html' %}
- {% block content %}
- <h1>Blog Posts</h1>
- {% for post in posts %}
- <div class="post">
- <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
- <p>Published: {{ post.published_date }}</p>
- <p>{{ post.content|truncatewords:30 }}</p>
- </div>
- {% endfor %}
- {% 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文件中创建测试用例。
- # myapp/tests.py
- from django.test import TestCase
- from django.utils import timezone
- from django.urls import reverse
- from .models import Post
- class PostModelTest(TestCase):
- def create_post(self, title="Test Post", content="Test Content"):
- return Post.objects.create(title=title, content=content, created_date=timezone.now())
-
- def test_post_creation(self):
- post = self.create_post()
- self.assertTrue(isinstance(post, Post))
- self.assertEqual(post.__str__(), post.title)
- class PostViewTest(TestCase):
- def setUp(self):
- self.post = Post.objects.create(title="Test Post", content="Test Content",
- created_date=timezone.now(), published_date=timezone.now())
-
- def test_post_list_view(self):
- url = reverse('post_list')
- resp = self.client.get(url)
- self.assertEqual(resp.status_code, 200)
- self.assertIn(self.post.title, resp.content.decode())
-
- def test_post_detail_view(self):
- url = reverse('post_detail', kwargs={'pk': self.post.pk})
- resp = self.client.get(url)
- self.assertEqual(resp.status_code, 200)
- 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. 修改设置:创建生产环境设置文件。
- # myproject/settings_production.py
- from .settings import *
- # SECURITY WARNING: don't run with debug turned on in production!
- DEBUG = False
- ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com']
- # Database
- # https://docs.djangoproject.com/en/3.1/ref/settings/#databases
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'mydatabase',
- 'USER': 'mydatabaseuser',
- 'PASSWORD': 'mypassword',
- 'HOST': 'localhost',
- 'PORT': '5432',
- }
- }
- # Static files (CSS, JavaScript, Images)
- # https://docs.djangoproject.com/en/3.1/howto/static-files/
- STATIC_ROOT = '/var/www/static/'
- MEDIA_ROOT = '/var/www/media/'
- # Security settings
- SECURE_SSL_REDIRECT = True
- SESSION_COOKIE_SECURE = True
- CSRF_COOKIE_SECURE = True
- SECURE_BROWSER_XSS_FILTER = True
- SECURE_CONTENT_TYPE_NOSNIFF = True
- X_FRAME_OPTIONS = 'DENY'
复制代码
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:
- # Dockerfile
- FROM python:3.8
- ENV PYTHONUNBUFFERED 1
- RUN mkdir /code
- WORKDIR /code
- COPY requirements.txt /code/
- RUN pip install -r requirements.txt
- COPY . /code/
复制代码
1. 创建docker-compose.yml:
- # docker-compose.yml
- version: '3'
- services:
- db:
- image: postgres
- environment:
- POSTGRES_PASSWORD: mypassword
- POSTGRES_DB: mydatabase
- POSTGRES_USER: mydatabaseuser
- web:
- build: .
- command: python manage.py runserver 0.0.0.0:8000
- volumes:
- - .:/code
- ports:
- - "8000:8000"
- depends_on:
- - 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. 创建Gunicorn配置文件:
- # gunicorn.conf.py
- bind = "0.0.0.0:8000"
- workers = 4
复制代码
1. 创建Nginx配置文件:
- # /etc/nginx/sites-available/myproject
- server {
- listen 80;
- server_name your-domain.com www.your-domain.com;
- location /static/ {
- root /var/www/static;
- }
- location /media/ {
- root /var/www/media;
- }
- location / {
- proxy_pass http://127.0.0.1:8000;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
复制代码
1. 启用Nginx配置:
- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
- sudo nginx -t
- sudo systemctl restart nginx
复制代码
1. 创建systemd服务文件:
- # /etc/systemd/system/gunicorn.service
- [Unit]
- Description=gunicorn daemon
- After=network.target
- [Service]
- User=www-data
- Group=www-data
- WorkingDirectory=/path/to/your/project
- ExecStart=/path/to/your/venv/bin/gunicorn --config gunicorn.conf.py myproject.wsgi:application
- [Install]
- WantedBy=multi-user.target
复制代码
1. 启动Gunicorn服务:
- sudo systemctl start gunicorn
- sudo systemctl enable gunicorn
复制代码
实际案例:构建一个博客应用
为了展示PyCharm和Django的强大功能,让我们通过构建一个简单的博客应用来实践上述知识。
创建项目和应用
首先,在PyCharm中创建一个新的Django项目,然后创建一个博客应用:
- python manage.py startapp blog
复制代码
在settings.py中注册应用:
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'blog',
- ]
复制代码
定义模型
定义博客文章和评论的模型:
- # blog/models.py
- from django.db import models
- from django.contrib.auth.models import User
- from django.utils import timezone
- class PublishedManager(models.Manager):
- def get_queryset(self):
- return super().get_queryset().filter(status='published')
- class Post(models.Model):
- STATUS_CHOICES = (
- ('draft', 'Draft'),
- ('published', 'Published'),
- )
- title = models.CharField(max_length=250)
- slug = models.SlugField(max_length=250, unique_for_date='publish')
- author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
- body = models.TextField()
- publish = models.DateTimeField(default=timezone.now)
- created = models.DateTimeField(auto_now_add=True)
- updated = models.DateTimeField(auto_now=True)
- status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
-
- objects = models.Manager() # The default manager.
- published = PublishedManager() # Our custom manager.
-
- class Meta:
- ordering = ('-publish',)
-
- def __str__(self):
- return self.title
- class Comment(models.Model):
- post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
- name = models.CharField(max_length=80)
- email = models.EmailField()
- body = models.TextField()
- created = models.DateTimeField(auto_now_add=True)
- updated = models.DateTimeField(auto_now=True)
- active = models.BooleanField(default=True)
-
- class Meta:
- ordering = ('created',)
-
- def __str__(self):
- return f'Comment by {self.name} on {self.post}'
复制代码
运行数据库迁移:
- python manage.py makemigrations
- python manage.py migrate
复制代码
创建视图
创建博客文章列表、详情和评论视图:
- # blog/views.py
- from django.shortcuts import render, get_object_or_404
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- from .models import Post, Comment
- from .forms import CommentForm
- def post_list(request):
- object_list = Post.published.all()
- paginator = Paginator(object_list, 3) # 3 posts in each page
- page = request.GET.get('page')
- try:
- posts = paginator.page(page)
- except PageNotAnInteger:
- # If page is not an integer deliver the first page
- posts = paginator.page(1)
- except EmptyPage:
- # If page is out of range deliver last page of results
- posts = paginator.page(paginator.num_pages)
- return render(request, 'blog/post/list.html', {'posts': posts})
- def post_detail(request, year, month, day, post):
- post = get_object_or_404(Post, slug=post,
- status='published',
- publish__year=year,
- publish__month=month,
- publish__day=day)
-
- # List of active comments for this post
- comments = post.comments.filter(active=True)
-
- new_comment = None
-
- if request.method == 'POST':
- # A comment was posted
- comment_form = CommentForm(data=request.POST)
- if comment_form.is_valid():
- # Create Comment object but don't save to database yet
- new_comment = comment_form.save(commit=False)
- # Assign the current post to the comment
- new_comment.post = post
- # Save the comment to the database
- new_comment.save()
- else:
- comment_form = CommentForm()
-
- return render(request, 'blog/post/detail.html', {'post': post,
- 'comments': comments,
- 'new_comment': new_comment,
- 'comment_form': comment_form})
复制代码
创建表单
创建评论表单:
- # blog/forms.py
- from django import forms
- from .models import Comment
- class CommentForm(forms.ModelForm):
- class Meta:
- model = Comment
- fields = ('name', 'email', 'body')
复制代码
配置URL
配置博客应用的URL:
- # blog/urls.py
- from django.urls import path
- from . import views
- app_name = 'blog'
- urlpatterns = [
- path('', views.post_list, name='post_list'),
- path('<int:year>/<int:month>/<int:day>/<slug:post>/',
- views.post_detail,
- name='post_detail'),
- ]
复制代码
在项目的主URL配置中包含博客应用的URL:
- # myproject/urls.py
- from django.contrib import admin
- from django.urls import path, include
- from django.conf import settings
- from django.conf.urls.static import static
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('blog/', include('blog.urls')),
- ]
- if settings.DEBUG:
- urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
复制代码
创建模板
创建博客文章列表和详情模板:
- <!-- blog/templates/blog/base.html -->
- <!DOCTYPE html>
- <html>
- <head>
- <title>{% block title %}Django Blog{% endblock %}</title>
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
- </head>
- <body>
- <div class="container">
- <nav class="navbar navbar-expand-lg navbar-light bg-light">
- <a class="navbar-brand" href="{% url 'blog:post_list' %}">Django Blog</a>
- <div class="collapse navbar-collapse">
- <ul class="navbar-nav mr-auto">
- <li class="nav-item">
- <a class="nav-link" href="{% url 'admin:index' %}">Admin</a>
- </li>
- </ul>
- </div>
- </nav>
- <div class="content">
- {% block content %}
- {% endblock %}
- </div>
- </div>
- </body>
- </html>
复制代码- <!-- blog/templates/blog/post/list.html -->
- {% extends "blog/base.html" %}
- {% block title %}Django Blog{% endblock %}
- {% block content %}
- <h1>Django Blog</h1>
- {% for post in posts %}
- <h2>
- <a href="{{ post.get_absolute_url }}">
- {{ post.title }}
- </a>
- </h2>
- <p class="date">
- Published {{ post.publish }} by {{ post.author }}
- </p>
- {{ post.body|truncatewords:30|linebreaks }}
- {% endfor %}
-
- {% include "pagination.html" with page=posts %}
- {% endblock %}
复制代码- <!-- blog/templates/blog/post/detail.html -->
- {% extends "blog/base.html" %}
- {% block title %}{{ post.title }}{% endblock %}
- {% block content %}
- <h1>{{ post.title }}</h1>
- <div class="date">
- Published {{ post.publish }} by {{ post.author }}
- </div>
- {{ post.body|linebreaks }}
-
- <hr>
-
- <h2>Comments</h2>
- {% if new_comment %}
- <div class="alert alert-success">
- Your comment has been added.
- </div>
- {% endif %}
- {% for comment in comments %}
- <div class="comment">
- <p class="info">
- Comment {{ forloop.counter }} by {{ comment.name }}
- {{ comment.created }}
- </p>
- {{ comment.body|linebreaks }}
- </div>
- {% empty %}
- <p>There are no comments yet.</p>
- {% endfor %}
-
- <h2>Add a new comment</h2>
- <form action="." method="post">
- {{ comment_form.as_p }}
- {% csrf_token %}
- <p><input type="submit" value="Add comment"></p>
- </form>
- {% endblock %}
复制代码
注册模型到管理后台
将博客文章和评论模型注册到Django管理后台:
- # blog/admin.py
- from django.contrib import admin
- from .models import Post, Comment
- @admin.register(Post)
- class PostAdmin(admin.ModelAdmin):
- list_display = ('title', 'slug', 'author', 'publish', 'status')
- list_filter = ('status', 'created', 'publish', 'author')
- search_fields = ('title', 'body')
- prepopulated_fields = {'slug': ('title',)}
- raw_id_fields = ('author',)
- date_hierarchy = 'publish'
- ordering = ('status', 'publish')
- @admin.register(Comment)
- class CommentAdmin(admin.ModelAdmin):
- list_display = ('name', 'email', 'post', 'created', 'active')
- list_filter = ('active', 'created', 'updated')
- search_fields = ('name', 'email', 'body')
复制代码
运行项目
现在,可以运行项目并查看结果:
- 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应用。 |
|