博客页面的MVP功能的需求文档
博客应用 MVP 需求文档
1. 目标
搭建一个简单的博客应用,用户可以在该应用上发布、查看、编辑和删除文章。
2. 用户故事
- 作为一个用户,我希望能够在博客上发布新的文章,以分享我的想法和经验。
- 作为一个用户,我希望能够浏览博客上已发布的文章,以获取有价值的信息。
- 作为一个用户,我希望能够编辑博客上已发布的文章,以更新内容或纠正错误。
- 作为一个用户,我希望能够删除博客上已发布的文章,以去除不需要的内容。
3. 功能需求
- 文章列表页:
- 显示所有已发布的文章标题和摘要。
- 提供链接以查看完整文章内容。
- 提供链接以创建新文章。
- 文章详情页:
- 显示选定文章的完整内容。
- 提供链接以返回文章列表页。
- 提供链接以编辑文章。
- 提供链接以删除文章。
- 创建文章页:
- 提供表单以输入文章标题和内容。
- 提供按钮以提交表单发布新文章。
- 提供按钮以取消发布并返回文章列表页。
- 编辑文章页:
- 显示选定文章的标题和内容。
- 提供表单以编辑文章标题和内容。
- 提供按钮以提交表单保存已编辑的文章。
- 提供按钮以取消编辑并返回文章详情页。
- 删除确认页:
- 显示选定文章的标题和删除确认信息。
- 提供按钮以确认删除文章。
- 提供按钮以取消删除并返回文章详情页。
4. 技术实现
- 使用 Django 框架来搭建后端应用,包括数据模型、视图和路由。
- 使用 Django 模板语言来渲染前端页面。
- 使用数据库来存储文章数据,例如 SQLite。
- 使用 HTML 和 CSS 来设计和美化前端页面布局和样式。
- 部署应用到服务器上,以便用户可以访问和使用。
5. 下一步计划
- 实现基本的文章发布、查看、编辑和删除功能。
- 添加用户身份验证和权限控制,以便只有管理员用户才能编辑和删除文章。
- 改进前端界面和用户体验,使其更加友好和易用。
- 添加文章分类和标签功能,以便用户可以更方便地浏览和过滤文章。
- 添加评论和点赞功能,以增加用户互动和社交性。
- 监控和改进应用性能,确保其稳定和高效运行。
6. 备注
此需求文档只包含了最基本的功能需求,为了实现更完整和复杂的博客应用,可能需要进一步讨论和规划。
用Django开发一个简单博客系统
开发一个简单的Django应用。这个应用将是一个基本的博客系统,可以创建、查看、编辑和删除文章。
第一步:设置开发环境
-
安装Python: 确保你安装了Python 3.6或更高版本。
-
安装Django: 打开终端或命令行界面,输入以下命令安装Django:
pip install django
第二步:创建Django项目
-
创建项目: 在你希望存放项目的目录下,运行以下命令创建一个新的Django项目:
django-admin startproject myblog
-
启动开发服务器: 进入项目目录并启动开发服务器,确保一切正常运行:
cd myblog python manage.py runserver
-
打开浏览器,访问 http://127.0.0.1:8000/
,你应该能看到Django的欢迎页面。
第三步:创建应用
用pycharm打开项目文件myblog
-
创建应用: 在命令端创建一个名为
blog
的应用,运行以下命令:python manage.py startapp blog
-
注册应用: 在
myblog/settings.py
文件中的INSTALLED_APPS
列表中添加'blog'
:INSTALLED_APPS = [ ... 'blog', ]
如下图所示:
-
第四步:定义模型
-
定义文章模型: 在
blog/models.py
文件中,定义一个简单的文章模型:from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title
2创建数据库迁移: 运行以下命令生成并应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
第五步:创建管理界面
-
注册模型: 在
blog/admin.py
文件中,注册Post
模型:from django.contrib import admin from .models import Post admin.site.register(Post)
-
创建超级用户: 运行以下命令创建一个超级用户,跟随提示完成创建:
python manage.py createsuperuser
-
-
访问管理界面: 运行开发服务器并访问
http://127.0.0.1:8000/admin/
,使用超级用户账号登录,你应该能看到并管理Post
模型。使用admin账号密码登录成功
第六步:创建视图和模板
-
创建视图: 在
blog/views.py
文件中,创建基本的视图来显示文章列表和详细内容:from django.shortcuts import render, get_object_or_404 from .models import Post def post_list(request): posts = Post.objects.all() return render(request, 'blog/post_list.html', {'posts': posts}) def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, 'blog/post_detail.html', {'post': post})
-
定义URL: 在
blog/urls.py
文件中,定义URL模式: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'), ]
然后在
myblog/urls.py
文件中包含blog
的URL:from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), ]
3.创建模板: 创建模板文件夹
blog/templates/blog
并创建两个HTML模板文件post_list.html
和post_detail.html
:-
post_list.html
:<!DOCTYPE html> <html> <head> <title>Blog</title> </head> <body> <h1>Blog Posts</h1> <ul> {% for post in posts %} <li> <a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a> </li> {% endfor %} </ul> </body> </html>
-
post_detail.html
:
<!DOCTYPE html>
<html>
<head>
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<p>Published on: {{ post.created_at }}</p>
</body>
</html>
第七步:运行应用
启动开发服务器并访问 http://127.0.0.1:8000/
,你应该能看到文章列表,并且可以点击文章标题查看详细内容。
结论
你现在已经创建了一个简单的Django博客应用,可以创建、查看文章。你可以继续扩展这个应用,添加用户认证、文章编辑、删除功能,或其他你需要的功能。
用户身份验证和权限控制
为页面添加权限控制
# models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
# views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Post
from .forms import PostForm
@login_required
def post_create(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, 'blog/post_form.html', {'form': form})
@login_required
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if post.author != request.user:
return redirect('post_detail', pk=pk)
if request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_form.html', {'form': form})
@login_required
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk)
if post.author != request.user:
return redirect('post_detail', pk=pk)
if request.method == 'POST':
post.delete()
return redirect('post_list')
return render(request, 'blog/post_confirm_delete.html', {'post': post})
<!-- post_list.html -->
{% if user.is_authenticated %}
<a href="{% url 'post_create' %}">Create New Post</a>
{% endif %}
{% for post in posts %}
<h2><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></h2>
<p>{{ post.content }}</p>
<p>Published by: {{ post.author.username }}</p>
{% if user.is_authenticated and user == post.author %}
<a href="{% url 'post_edit' post.pk %}">Edit</a>
<a href="{% url 'post_delete' post.pk %}">Delete</a>
{% endif %}
{% endfor %}
在上述代码中,我们通过 @login_required
装饰器来限制只有已登录的用户才能访问创建、编辑和删除文章的功能。此外,我们在视图函数中检查了用户是否是文章的作者,只有作者才能编辑和删除自己的文章。在模板中,我们也根据用户的身份来显示相应的链接。
执行后报错no such column: blog_post.author_id
,分析原因这个错误表明在数据库表中缺少一个名为 author_id
的列,这个列是用来保存文章作者的信息的。这通常是由于模型定义中的外键字段没有正确地关联到用户模型引起的。然后,运行以下命令来生成并应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
提示为已经增加的author_id添加默认值
再次运行项目,并且在http://127.0.0.1:8000/admin里面添加post相关内容
添加登录系统
为了在Django项目中添加用户身份验证和权限控制系统,你需要实现用户注册、登录、登出等功能,并确保这些功能的视图和模板正常工作。下面是详细的步骤:
1. 安装Django Authentication Middleware
Django自带用户认证系统,所以不需要额外安装。确保在你的settings.py
文件中包含了相关的中间件和应用程序:
# settings.py
INSTALLED_APPS = [
...
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
]
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
2. 设置URL路径
在你的主urls.py文件中设置URL路径,包含Django自带的认证视图:
# myblog/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')), # 添加这一行
path('', include('blog.urls')),
]
3. 创建注册视图和表单
你需要一个用户注册表单和一个处理用户注册的视图。首先,创建一个forms.py
文件并添加注册表单:
# blog/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, required=True, help_text='Required. Enter a valid email address.')
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
接下来,在views.py
中创建一个视图来处理注册请求:
# blog/views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import SignUpForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('post_list')
else:
form = SignUpForm()
return render(request, 'blog/signup.html', {'form': form})
4. 创建模板
为登录、注册和其他身份验证相关的页面创建模板文件:
registration/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
</body>
</html>
blog/signup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sign Up</title>
</head>
<body>
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign Up</button>
</form>
</body>
</html>
5. 配置URLs
在你的blog/urls.py
文件中配置URLs来处理注册视图:
# blog/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_create, name='post_create'),
path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
path('signup/', views.signup, name='signup'),
]
为了在Django项目中添加用户身份验证和权限控制系统,你需要实现用户注册、登录、登出等功能,并确保这些功能的视图和模板正常工作。下面是详细的步骤:
1. 安装Django Authentication Middleware
Django自带用户认证系统,所以不需要额外安装。确保在你的settings.py
文件中包含了相关的中间件和应用程序:
python复制代码# settings.py
INSTALLED_APPS = [
...
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
]
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
2. 设置URL路径
在你的主urls.py文件中设置URL路径,包含Django自带的认证视图:
python复制代码# myblog/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')), # 添加这一行
path('', include('blog.urls')),
]
3. 创建注册视图和表单
你需要一个用户注册表单和一个处理用户注册的视图。首先,创建一个forms.py
文件并添加注册表单:
python复制代码# blog/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, required=True, help_text='Required. Enter a valid email address.')
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
接下来,在views.py
中创建一个视图来处理注册请求:
python复制代码# blog/views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import SignUpForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('post_list')
else:
form = SignUpForm()
return render(request, 'blog/signup.html', {'form': form})
4. 创建模板
为登录、注册和其他身份验证相关的页面创建模板文件:
registration/login.html
html复制代码<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
</body>
</html>
blog/signup.html
html复制代码<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sign Up</title>
</head>
<body>
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign Up</button>
</form>
</body>
</html>
5. 配置URLs
在你的blog/urls.py
文件中配置URLs来处理注册视图:
python复制代码# blog/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_create, name='post_create'),
path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
path('signup/', views.signup, name='signup'),
]
6. 更新模板中的链接
在你的模板中,添加链接以便用户能够注册、登录和登出。例如,在base.html
中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Blog</title>
</head>
<body>
<nav>
<a href="{% url 'post_list' %}">Home</a>
{% if user.is_authenticated %}
<a href="{% url 'post_create' %}">New Post</a>
<a href="{% url 'logout' %}">Logout</a>
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
</nav>
{% block content %}
{% endblock %}
</body>
</html>
7. 确保权限控制
确保只有管理员用户可以编辑和删除文章。你可以在视图中检查用户的权限:
# views.py
from django.contrib.auth.decorators import login_required, user_passes_test
def is_admin(user):
return user.is_superuser
@login_required
def post_create(request):
if not request.user.is_superuser:
return redirect('post_list')
# 其余代码保持不变
@login_required
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if not request.user.is_superuser:
return redirect('post_detail', pk=pk)
# 其余代码保持不变
@login_required
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk)
if not request.user.is_superuser:
return redirect('post_detail', pk=pk)
# 其余代码保持不变
通过以上步骤,你就可以在你的Django项目中添加用户身份验证和权限控制功能了。用户可以注册、登录、发布、编辑和删除文章,只有管理员用户可以进行编辑和删除操作。
结果点击logout不生效
按照以下步骤进行检查和配置:
1. 确保正确包含了django.contrib.auth.urls
在主urls.py文件中,确认你已包含了django.contrib.auth.urls
:
# myblog/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')), # 确保包含了这一行
path('', include('blog.urls')),
]
django.contrib.auth.urls
包含了内置的登录和注销视图,并处理相应的URL模式。
2. 检查模板中的Logout链接
确保你的模板中有一个指向logout
的链接:
<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Blog</title>
</head>
<body>
<nav>
<a href="{% url 'post_list' %}">Home</a>
{% if user.is_authenticated %}
<a href="{% url 'post_create' %}">New Post</a>
<a href="{% url 'logout' %}">Logout</a>
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
</nav>
{% block content %}
{% endblock %}
</body>
</html>
3. 检查Django设置
确保在settings.py
中正确配置了登录和注销的重定向URL:
# settings.py
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
4. 确认注销视图正常工作
默认的Django注销视图应该已经正常工作,但你可以自定义注销视图来确认它的功能:
# blog/views.py
from django.contrib.auth import logout
from django.shortcuts import redirect
def custom_logout(request):
logout(request)
return redirect('post_list')
然后在urls.py
中添加自定义注销视图:
# blog/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_create, name='post_create'),
path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
path('signup/', views.signup, name='signup'),
path('logout/', views.custom_logout, name='logout'), # 使用自定义注销视图
]
结果正常
点击login报错
分析是registration/login的路径错误,迁移到以下目录
登录成功,如下