Django 应用开发:用户登录、注册与游戏数据模型构建
1. 测试登录/注销表单
在开始测试登录和注销功能之前,需要对 Django 项目进行一些设置。
-
设置登录重定向 URL
:打开
gamestore/gamestore
目录下的
settings.py
文件,在文件末尾添加以下设置:
LOGIN_REDIRECT_URL = '/'
这会告知 Django,用户登录后将被重定向到根路径
/
。
-
启动开发服务器并测试
:
- 运行以下命令启动 Django 开发服务器:
python manage.py runserver
2. 浏览到 `http://localhost:8000`,此时页面右上角会出现登录链接。
3. 点击登录链接,会被重定向到 `/accounts/login`,并显示我们创建的登录页面模板。
4. 先尝试输入错误的用户名或密码,验证错误消息是否正确显示。
5. 使用之前创建的超级用户进行登录,如果一切正常,会被重定向到应用的根 URL,页面会显示已登录的用户名,旁边还有注销链接,点击注销链接进行测试。
2. 创建新用户
为了让用户能够在应用中创建账户并下单,需要添加一个注册页面,并设置一些创建新账户的规则:
- 用户名必须填写,且在应用中唯一。
- 电子邮件必须填写,且在应用中唯一。
- 姓和名必须填写。
- 两个密码字段都必须填写,且密码必须匹配。
如果不满足这些规则,将不会创建用户账户,并向用户返回错误信息。
2.1 添加验证函数
打开
gamestore/main
目录下的
forms.py
文件,添加以下代码:
from django.contrib.auth.models import User
from django import forms
def validate_unique_user(error_message, **criteria):
existent_user = User.objects.filter(**criteria)
if existent_user:
raise forms.ValidationError(error_message)
这个函数用于验证字段值是否已存在于数据库中。
2.2 创建注册表单类
在
forms.py
文件中继续添加以下代码:
class SignupForm(forms.Form):
username = forms.CharField(
max_length=10,
widget=forms.TextInput({
'class': 'form-control',
'placeholder': 'First name'
})
)
first_name = forms.CharField(
max_length=100,
widget=forms.TextInput({
'class': 'form-control',
'placeholder': 'First name'
})
)
last_name = forms.CharField(
max_length=200,
widget=forms.TextInput({
'class': 'form-control',
'placeholder': 'Last name'
})
)
email = forms.CharField(
max_length=200,
widget=forms.TextInput({
'class': 'form-control',
'placeholder': 'Email'
})
)
password = forms.CharField(
min_length=6,
max_length=10,
widget=forms.PasswordInput({
'class': 'form-control',
'placeholder': 'Password'
})
)
repeat_password = forms.CharField(
min_length=6,
max_length=10,
widget=forms.PasswordInput({
'class': 'form-control',
'placeholder': 'Repeat password'
})
)
这个类定义了用户注册时需要填写的所有字段。
2.3 添加字段验证方法
在
SignupForm
类中添加以下方法:
def clean_username(self):
username = self.cleaned_data['username']
validate_unique_user(
error_message='* Username already in use',
username=username)
return username
def clean_email(self):
email = self.cleaned_data['email']
validate_unique_user(
error_message='* Email already in use',
email=email)
return email
def clean_repeat_password(self):
password1 = self.cleaned_data['password']
password2 = self.cleaned_data['repeat_password']
if password1 != password2:
raise forms.ValidationError('* Passwords did not match')
return password1
这些方法分别用于验证用户名、电子邮件的唯一性,以及两个密码字段是否匹配。
3. 创建用户注册视图
打开
gamestore/main
目录下的
views.py
文件,添加以下导入语句和注册函数:
from django.views.decorators.csrf import csrf_protect
from .forms import SignupForm
from django.contrib.auth.models import User
from django.shortcuts import render
@csrf_protect
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
first_name=form.cleaned_data['first_name'],
last_name=form.cleaned_data['last_name'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password']
)
user.save()
return render(request, 'main/create_account_success.html', {})
else:
form = SignupForm()
return render(request, 'main/signup.html', {'form': form})
这个函数处理用户注册请求,如果请求方法是 POST,会验证表单数据,如果表单有效则创建新用户并保存,最后渲染注册成功页面;如果请求方法是 GET,则创建一个空的注册表单并渲染注册页面。
4. 创建 URL 和模板
-
创建 URL
:打开
gamestore/main目录下的url.py文件,在urlpatterns列表末尾添加以下代码:
from django.urls import path
from . import views
urlpatterns = [
# 其他 URL 配置
path(r'accounts/signup/', views.signup, name='signup'),
]
-
创建注册模板
:在
gamestore/main/templates/main目录下创建signup.html文件,内容如下:
{% extends "base.html" %}
{% block "content" %}
<div class="account-details-container">
<h1>Signup</h1>
<form action="{% url 'signup' %}" method="POST">
{% csrf_token %}
{{ form }}
<button class="btn btn-primary">Save</button>
</form>
</div>
{% endblock %}
-
创建注册成功模板
:在
gamestore/main/templates/main目录下创建create_account_success.html文件,内容如下:
{% extends 'base.html' %}
{% block 'content' %}
<div class='create-account-msg-container'>
<div class='circle'>
<i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
</div>
<h3>Your account have been successfully created!</h3>
<a href="{% url 'login' %}">Click here to login</a>
</div>
{% endblock %}
5. 添加 CSS 样式
打开
gamestore/static
目录下的
site.css
文件,在文件末尾添加以下 CSS 代码,让页面看起来更美观:
/* Account created page */
.create-account-msg-container {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 100px;
}
.create-account-msg-container .circle {
width: 200px;
height: 200px;
border: solid 3px;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 30px;
border-radius: 50%;
}
.create-account-msg-container .fa-thumbs-o-up {
font-size: 9em;
}
.create-account-msg-container a {
font-size: 1.5em;
}
/* Sign up page */
.account-details-container #id_password,
.account-details-container #id_repeat_password {
width:200px;
}
.account-details-container {
max-width: 400px;
padding: 15px;
margin: 0 auto;
}
.account-details-container .btn.btn-primary {
margin-top:20px;
}
.account-details-container label {
margin-top: 20px;
}
.account-details-container .errorlist {
padding-left: 10px;
display: inline-block;
list-style: none;
color: red;
}
6. 测试注册功能
再次启动 Django 开发服务器,浏览到
http://localhost:8000/accounts/signup
,填写注册表单,提交后如果一切正常,会被重定向到注册成功页面。可以尝试输入无效的密码等情况,验证我们实现的验证功能是否正常工作。
7. 创建游戏数据模型
为了在应用中表示商店里可购买的游戏,需要创建游戏数据模型,满足以下要求:
- 商店将销售不同游戏平台的游戏。
- 首页会有一个部分列出热门游戏。
- 用户可以进入游戏详情页查看更多游戏信息。
- 游戏可以根据不同标准(如开发者、发行商、发行日期等)进行搜索。
- 商店管理员可以使用 Django 管理界面更改产品详情。
- 产品图片可以更改,如果图片不存在,应显示默认图片。
7.1 创建游戏平台模型
打开
gamestore/main
目录下的
models.py
文件,添加以下代码:
from django.db import models
class GamePlatform(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
这个类表示商店中可用的游戏平台,只定义了一个
name
属性,并重写了
__str__
方法,以便在 Django 管理界面中显示平台名称。
7.2 创建游戏模型
在
models.py
文件中继续添加以下代码:
class Game(models.Model):
class Meta:
ordering = ['-promoted', 'name']
name = models.CharField(max_length=100)
release_year = models.IntegerField(null=True)
developer = models.CharField(max_length=100)
published_by = models.CharField(max_length=100)
image = models.ImageField(
upload_to='images/',
default='images/placeholder.png',
max_length=100
)
gameplatform = models.ForeignKey(GamePlatform,
null=False,
on_delete=models.CASCADE)
highlighted = models.BooleanField(default=False)
objects = GameManager()
def __str__(self):
return f'{self.gameplatform.name} - {self.name}'
这个类表示游戏,定义了多个字段,包括游戏名称、发行年份、开发者、发行商、图片、所属游戏平台和是否为热门游戏等。其中,
release_year
字段设置为可空,
image
字段使用
ImageField
类型,允许管理员更改游戏图片,
gameplatform
字段使用
ForeignKey
关联到
GamePlatform
模型,
highlighted
字段用于标记游戏是否为热门游戏。
Meta
类用于设置模型的元信息,这里设置了排序规则。
7.3 创建游戏管理器类
在
models.py
文件中,在
Game
类定义之前添加以下代码:
class GameManager(models.Manager):
def get_highlighted(self):
return self.filter(highlighted=True)
def get_not_highlighted(self):
return self.filter(highlighted=False)
def get_by_platform(self, platform):
return self.filter(gameplatform__name__iexact=platform)
这个类继承自
Manager
,定义了三个方法,分别用于获取热门游戏、非热门游戏和特定游戏平台的游戏。
7.4 创建数据库迁移文件并应用更改
在终端中运行以下命令:
python manage.py makemigrations
python manage.py migrate
makemigrations
命令会创建一个迁移文件,记录我们在模型中所做的更改,
migrate
命令会将这些更改应用到数据库中。
通过以上步骤,我们完成了 Django 应用中用户登录、注册功能的实现,以及游戏数据模型的构建,为后续的开发打下了基础。接下来我们将创建一个模型来存储游戏的价格。
以下是创建用户和游戏数据模型的流程图:
graph TD;
A[开始] --> B[测试登录/注销表单]
B --> C[创建新用户]
C --> D[创建用户注册视图]
D --> E[创建 URL 和模板]
E --> F[添加 CSS 样式]
F --> G[测试注册功能]
G --> H[创建游戏数据模型]
H --> I[创建游戏平台模型]
H --> J[创建游戏模型]
H --> K[创建游戏管理器类]
K --> L[创建数据库迁移文件并应用更改]
L --> M[结束]
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 测试登录/注销表单 | 设置登录重定向 URL,启动开发服务器,测试登录和注销功能 |
| 2 | 创建新用户 | 设置注册规则,添加验证函数和注册表单类,添加字段验证方法 |
| 3 | 创建用户注册视图 | 处理用户注册请求,根据请求方法渲染不同页面 |
| 4 | 创建 URL 和模板 | 创建注册 URL 和注册、注册成功模板 |
| 5 | 添加 CSS 样式 | 让页面更美观 |
| 6 | 测试注册功能 | 验证注册功能和验证规则 |
| 7 | 创建游戏数据模型 | 满足游戏展示和管理的需求 |
| 8 | 创建游戏平台模型 | 表示商店中可用的游戏平台 |
| 9 | 创建游戏模型 | 定义游戏的各个字段和关联关系 |
| 10 | 创建游戏管理器类 | 提供获取不同类型游戏的方法 |
| 11 | 创建数据库迁移文件并应用更改 | 将模型更改应用到数据库中 |
Django 应用开发:用户登录、注册与游戏数据模型构建
8. 创建游戏价格数据模型
在完成了用户登录、注册功能以及游戏数据模型的构建后,接下来我们要创建一个模型来存储游戏的价格。
8.1 定义游戏价格模型
打开
gamestore/main
目录下的
models.py
文件,在文件中添加以下代码:
class GamePrice(models.Model):
game = models.ForeignKey(Game, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=8, decimal_places=2)
start_date = models.DateField()
end_date = models.DateField(null=True, blank=True)
def __str__(self):
return f'{self.game.name} - ${self.price}'
在这个
GamePrice
类中:
-
game
字段是一个外键,关联到
Game
模型,使用
on_delete=models.CASCADE
表示当关联的游戏被删除时,对应的价格记录也会被删除。
-
price
字段使用
DecimalField
来存储游戏的价格,
max_digits=8
表示数字的最大位数为 8 位,
decimal_places=2
表示小数位数为 2 位。
-
start_date
字段记录价格开始生效的日期。
-
end_date
字段记录价格结束生效的日期,
null=True
和
blank=True
表示该字段可以为空。
-
__str__
方法用于在打印
GamePrice
实例时,显示游戏名称和价格。
8.2 创建数据库迁移文件并应用更改
和之前创建游戏数据模型时一样,在终端中运行以下命令:
python manage.py makemigrations
python manage.py migrate
makemigrations
命令会生成一个新的迁移文件,记录我们在
GamePrice
模型中所做的更改,
migrate
命令会将这些更改应用到数据库中。
9. 完善游戏数据管理功能
为了方便管理游戏数据,我们可以在 Django 管理界面中注册我们创建的模型。
打开
gamestore/main
目录下的
admin.py
文件,添加以下代码:
from django.contrib import admin
from .models import GamePlatform, Game, GamePrice
admin.site.register(GamePlatform)
admin.site.register(Game)
admin.site.register(GamePrice)
这样,我们就可以在 Django 管理界面(
http://localhost:8000/admin
)中方便地对游戏平台、游戏和游戏价格进行增删改查操作。
10. 优化用户体验
为了提升用户在浏览和购买游戏时的体验,我们可以做一些优化。
10.1 添加游戏列表页面
在
gamestore/main/views.py
文件中添加以下视图函数:
from django.shortcuts import render
from .models import Game
def game_list(request):
games = Game.objects.all()
return render(request, 'main/game_list.html', {'games': games})
在
gamestore/main/urls.py
文件中添加对应的 URL 配置:
urlpatterns = [
# 其他 URL 配置
path('games/', views.game_list, name='game_list'),
]
创建
gamestore/main/templates/main/game_list.html
文件,内容如下:
{% extends "base.html" %}
{% block "content" %}
<h1>Game List</h1>
<ul>
{% for game in games %}
<li>
<img src="{{ game.image.url }}" alt="{{ game.name }}" width="100">
<h2>{{ game.name }}</h2>
<p>Platform: {{ game.gameplatform.name }}</p>
<p>Developer: {{ game.developer }}</p>
<p>Published By: {{ game.published_by }}</p>
<!-- 可以根据需要添加更多信息 -->
</li>
{% endfor %}
</ul>
{% endblock %}
这样,用户就可以在
http://localhost:8000/games/
页面查看所有游戏的列表。
10.2 添加游戏详情页面
在
gamestore/main/views.py
文件中添加以下视图函数:
from django.shortcuts import get_object_or_404, render
from .models import Game
def game_detail(request, game_id):
game = get_object_or_404(Game, id=game_id)
return render(request, 'main/game_detail.html', {'game': game})
在
gamestore/main/urls.py
文件中添加对应的 URL 配置:
urlpatterns = [
# 其他 URL 配置
path('games/<int:game_id>/', views.game_detail, name='game_detail'),
]
创建
gamestore/main/templates/main/game_detail.html
文件,内容如下:
{% extends "base.html" %}
{% block "content" %}
<h1>{{ game.name }}</h1>
<img src="{{ game.image.url }}" alt="{{ game.name }}" width="200">
<p>Platform: {{ game.gameplatform.name }}</p>
<p>Developer: {{ game.developer }}</p>
<p>Published By: {{ game.published_by }}</p>
<p>Release Year: {{ game.release_year }}</p>
<!-- 可以根据需要添加更多信息 -->
{% endblock %}
用户可以通过点击游戏列表中的游戏名称,进入对应的游戏详情页面,查看更详细的游戏信息。
11. 总结
通过以上一系列的步骤,我们完成了一个较为完整的 Django 应用开发。具体包括:
1.
用户登录与注册功能
:实现了用户的登录、注销和注册功能,设置了注册规则并进行了相应的验证,同时创建了注册页面和注册成功页面。
2.
游戏数据模型构建
:创建了游戏平台、游戏和游戏价格的数据模型,并将这些模型应用到数据库中,方便对游戏数据进行管理。
3.
数据管理与用户体验优化
:在 Django 管理界面中注册了模型,方便管理员进行数据管理,同时添加了游戏列表和游戏详情页面,提升了用户的浏览体验。
以下是整个开发流程的详细表格总结:
| 阶段 | 步骤 | 操作 | 说明 |
| ---- | ---- | ---- | ---- |
| 用户功能实现 | 1 | 测试登录/注销表单 | 设置登录重定向 URL,启动开发服务器,测试登录和注销功能 |
| | 2 | 创建新用户 | 设置注册规则,添加验证函数和注册表单类,添加字段验证方法 |
| | 3 | 创建用户注册视图 | 处理用户注册请求,根据请求方法渲染不同页面 |
| | 4 | 创建 URL 和模板 | 创建注册 URL 和注册、注册成功模板 |
| | 5 | 添加 CSS 样式 | 让页面更美观 |
| | 6 | 测试注册功能 | 验证注册功能和验证规则 |
| 游戏数据模型构建 | 7 | 创建游戏数据模型 | 满足游戏展示和管理的需求 |
| | 8 | 创建游戏平台模型 | 表示商店中可用的游戏平台 |
| | 9 | 创建游戏模型 | 定义游戏的各个字段和关联关系 |
| | 10 | 创建游戏管理器类 | 提供获取不同类型游戏的方法 |
| | 11 | 创建数据库迁移文件并应用更改 | 将模型更改应用到数据库中 |
| | 12 | 创建游戏价格数据模型 | 存储游戏的价格信息 |
| | 13 | 创建数据库迁移文件并应用更改 | 将游戏价格模型更改应用到数据库中 |
| 数据管理与体验优化 | 14 | 完善游戏数据管理功能 | 在 Django 管理界面中注册模型,方便数据管理 |
| | 15 | 优化用户体验 | 添加游戏列表和游戏详情页面,提升用户浏览体验 |
以下是整个开发流程的流程图:
graph TD;
A[开始] --> B[测试登录/注销表单]
B --> C[创建新用户]
C --> D[创建用户注册视图]
D --> E[创建 URL 和模板]
E --> F[添加 CSS 样式]
F --> G[测试注册功能]
G --> H[创建游戏数据模型]
H --> I[创建游戏平台模型]
H --> J[创建游戏模型]
H --> K[创建游戏管理器类]
K --> L[创建数据库迁移文件并应用更改]
L --> M[创建游戏价格数据模型]
M --> N[创建数据库迁移文件并应用更改]
N --> O[完善游戏数据管理功能]
O --> P[优化用户体验]
P --> Q[结束]
通过以上的开发过程,我们可以看到 Django 框架在 Web 应用开发中的强大功能和便捷性,能够帮助我们快速实现各种功能,同时保证代码的可维护性和可扩展性。后续我们可以根据实际需求,继续添加更多的功能,如购物车、订单管理等。
超级会员免费看

被折叠的 条评论
为什么被折叠?



