22、Django 应用开发:用户登录、注册与游戏数据模型构建

Django 应用开发:用户登录、注册与游戏数据模型构建

1. 测试登录/注销表单

在开始测试登录和注销功能之前,需要对 Django 项目进行一些设置。
- 设置登录重定向 URL :打开 gamestore/gamestore 目录下的 settings.py 文件,在文件末尾添加以下设置:

LOGIN_REDIRECT_URL = '/'

这会告知 Django,用户登录后将被重定向到根路径 /

  • 启动开发服务器并测试
    1. 运行以下命令启动 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 应用开发中的强大功能和便捷性,能够帮助我们快速实现各种功能,同时保证代码的可维护性和可扩展性。后续我们可以根据实际需求,继续添加更多的功能,如购物车、订单管理等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值