22 Django 表单校验与错误处理实践

22 Django 表单校验与错误处理实践

在 Django 中,表单校验和错误处理是用户交互过程中至关重要的一部分。本文将通过实际案例深入探讨如何在 Django 中实现这一功能。

表单创建与校验

在 Django 中,表单通常通过 forms 模块来创建。让我们从一个基本示例开始,创建一个用户注册表单,并对输入进行校验。

创建用户注册表单

首先,我们需要定义一个表单类,通常是通过继承 forms.Form 来实现的:

1
2
3
4
5
6
from django import forms

class UserRegistrationForm(forms.Form):
username = forms.CharField(max_length=150)
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput())

在这个表单中,我们定义了三个字段:usernameemailpassword。Django 自动为常见字段类型(如 CharFieldEmailField)提供基本的校验,包括空值和格式校验。

在视图中处理表单

接下来,我们需要在视图中处理这个表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.shortcuts import render
from .forms import UserRegistrationForm

def register(request):
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
# 在这里处理有效的表单数据
username = form.cleaned_data['username']
email = form.cleaned_data['email']
password = form.cleaned_data['password']
# 可以在这里保存用户数据

return render(request, 'registration/success.html')

else:
form = UserRegistrationForm()

return render(request, 'registration/register.html', {'form': form})

在这个视图中,我们首先检查请求方式。如果是 POST,我们就用提交的数据来实例化表单。然后我们调用 is_valid() 方法来验证表单数据。

处理表单错误

如果表单不合法,我们需要将错误信息传递回模板。在上面的 register 视图中,如果表单无效,Django 会自动将错误信息保存在 form.errors 中。这些错误信息可以在模板中进行访问和展示。

在模板中显示错误信息

接下来,我们需要在我们的注册模板中显示表单和错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">注册</button>
</form>

{% if form.errors %}
<ul>
{% for field in form %}
{% for error in field.errors %}
<li>{{ field.label }}: {{ error }}</li>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}

在这个模板中,{{ form.as_p }} 会把表单字段以 <p> 标签的形式显示出来。我们还检查了 form.errors,并如果有错误就将其展示出来。

实战案例

接下来,让我们看一个更复杂的案例,结合模型和表单。比如我们要创建一个带有图片上传的用户资料更新表单。

创建模型

首先,定义一个用户模型(models.py):

1
2
3
4
5
6
from django.db import models

class UserProfile(models.Model):
username = models.CharField(max_length=150)
email = models.EmailField()
profile_picture = models.ImageField(upload_to='profile_pics/')

创建表单类

然后,创建对应的表单(forms.py):

1
2
3
4
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['username', 'email', 'profile_picture']

更新视图

接下来,更新视图(views.py)以处理文件上传及其校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.shortcuts import render, redirect
from .forms import UserProfileForm

def update_profile(request):
if request.method == 'POST':
form = UserProfileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('profile_success')

else:
form = UserProfileForm()

return render(request, 'profile/update.html', {'form': form})

文件上传设置

确保在 settings.py 中正确配置文件上传:

1
2
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

并在 urls.py 中添加媒体文件配置:

1
2
3
4
5
6
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
# 你的其他 URL 路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

模板更新

更新模板以支持文件上传(update.html):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">更新资料</button>
</form>

{% if form.errors %}
<ul>
{% for field in form %}
{% for error in field.errors %}
<li>{{ field.label }}: {{ error }}</li>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}

总结

通过以上步骤,我们实现了 Django 表单校验和错误处理。关键点在于:

  • 使用 forms.Formforms.ModelForm 定义表单。
  • 利用 .is_valid() 验证表单数据。
  • 通过模板展示表单和错误信息。

掌握这些内容将大大增强你在 Django 中构建用户交互的能力。

23 文件上传实战教程

23 文件上传实战教程

在Django中,文件上传是一个常见的功能。在本节中,我们将通过一个简单的案例来展示如何在Django中实现文件上传。

创建Django项目与应用

首先,确保你已经安装了Django。如果还没有,可以通过以下命令进行安装:

1
pip install django

接下来,我们创建一个新的Django项目和应用:

1
2
3
django-admin startproject myproject
cd myproject
django-admin startapp uploads

settings.py 中注册我们的应用:

1
2
3
4
5
# myproject/settings.py
INSTALLED_APPS = [
...
'uploads',
]

配置文件上传设置

我们需要在 settings.py 中添加一些设置,来配置文件上传的目录和管理静态文件:

1
2
3
4
5
# myproject/settings.py
import os

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL 是用来访问上传文件的URL,而 MEDIA_ROOT 是文件在服务器上存储的物理路径。

创建上传表单

uploads 应用中,我们创建一个文件上传的表单。首先在 forms.py 中定义一个表单:

1
2
3
4
5
# uploads/forms.py
from django import forms

class UploadFileForm(forms.Form):
file = forms.FileField(label='选择文件')

创建视图处理上传逻辑

接下来,在 views.py 中创建一个视图来处理文件上传的逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# uploads/views.py
from django.shortcuts import render
from .forms import UploadFileForm

def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return render(request, 'uploads/upload_success.html')
else:
form = UploadFileForm()
return render(request, 'uploads/upload.html', {'form': form})

def handle_uploaded_file(f):
with open(os.path.join(MEDIA_ROOT, f.name), 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)

在上面的代码中,handle_uploaded_file 函数负责将上传的文件保存到服务器的 MEDIA_ROOT 目录中。

创建模板

现在我们需要创建上传文件的模板。在 uploads 应用中创建一个 templates/uploads 目录,并在其中创建 upload.htmlupload_success.html 文件。

upload.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- uploads/templates/uploads/upload.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<h1>上传文件</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<button type="submit">上传</button>
</form>
</body>
</html>

upload_success.html:

1
2
3
4
5
6
7
8
9
10
11
12
<!-- uploads/templates/uploads/upload_success.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传成功</title>
</head>
<body>
<h1>文件上传成功!</h1>
<a href="{% url 'upload_file' %}">继续上传</a>
</body>
</html>

配置URL

最后,我们需要在 urls.py 中配置访问的路由。在 myproject/urls.py 中添加上传的URL:

1
2
3
4
5
6
7
8
9
10
11
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from uploads.views import upload_file
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
path('admin/', admin.site.urls),
path('upload/', upload_file, name='upload_file'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

测试文件上传功能

现在我们可以运行Django开发服务器并测试文件上传功能:

1
2
python manage.py migrate
python manage.py runserver

在浏览器中访问 http://127.0.0.1:8000/upload/,你应该能够看到上传表单。选择一个文件并点击“上传”按钮,随后你将看到上传成功的页面。

media 目录下,你可以找到你上传的文件。

总结

这就是在Django中实现文件上传的基本过程。在这个过程中,我们创建了一个表单来接受文件输入,并处理文件上传的逻辑。在实际应用中,你可以根据需要进行更多的文件处理和验证。

24 Django管理后台简介

24 Django管理后台简介

Django自带的管理后台是一个强大的工具,使得开发者可以有效地管理应用程序中的数据。它不仅支持快速的数据录入,还提供了便捷的界面来进行数据的浏览和修改。

什么是Django管理后台?

Django管理后台是一个基于web的界面,允许用户对项目中的数据模型进行增、删、改、查。通过配置,开发者能够快速为自己的应用程序创建一个功能齐全的管理界面。

如何启用Django管理后台?

要使用Django管理后台,首先需要确认你的应用已经安装了django.contrib.admin。在settings.py中,确保INSTALLED_APPS包含以下内容:

1
2
3
4
5
INSTALLED_APPS = [
...
'django.contrib.admin',
...
]

接下来,运行以下命令来创建初始的数据库和超级用户:

1
2
python manage.py migrate
python manage.py createsuperuser

运行完这些命令后,你可以启动开发服务器并访问管理界面:

1
python manage.py runserver

然后在浏览器中访问 http://127.0.0.1:8000/admin

自定义模型

假设我们有一个简单的博客应用,其中包含一个Post模型。我们首先定义这个模型,在models.py中添加如下代码:

1
2
3
4
5
6
7
8
9
from django.db import models

class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.title

然后,我们需要为这个模型在管理后台中注册,使其能够显示在管理界面。我们在admin.py中进行注册:

1
2
3
4
from django.contrib import admin
from .models import Post

admin.site.register(Post)

管理后台的使用

启动服务器并访问 http://127.0.0.1:8000/admin,使用之前创建的超级用户账户进行登录。登录后,你将看到注册的Post模型出现在管理界面中。

数据的增、删、改、查操作

  1. :点击 Post,然后点击右上角的 Add Post 按钮,输入标题和内容,保存后你就创建了一个新的博客文章。
  2. :在Post列表中,你可以查看所有的博客文章,并且可以通过搜索框轻松筛选。
  3. :点击任何一篇文章的标题,进入编辑模式,可以修改字体或内容后保存。
  4. :在文章列表中,选择要删除的文章,点击右上角的删除选项,即可将该条记录删除。

自定义管理后台

Django允许你自定义管理后台的展示方式。你可以通过继承ModelAdmin类来进行个性化设置,例如:

1
2
3
4
5
6
7
8
from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'published_date')
search_fields = ('title',)

admin.site.register(Post, PostAdmin)

在这个案例中,我们为Post模型自定义了管理界面,展示了标题和发布日期,并添加了按标题搜索的功能。

总结

Django的管理后台是一个非常便利的功能,能够极大地提高开发效率。通过简单的配置,我们可以为应用程序快速生成一个功能完善的后台管理界面,方便进行数据管理和维护。进一步的自定义功能,更使得管理后台可以满足特定的业务需求。