dede网站 远程生成,网站3级目录可以做导航分类么,全国的p2p网站建设,seo泛目录培训本篇是在完成用户登录登出#xff0c;密码修改功能后#xff0c;扩展用户注册功能。
关于用户登录、注销、更改密码和重置密码。请查看
Django身份验证初试-CSDN博客
Django登录注销视图-CSDN博客
Django密码修改和重置视图-CSDN博客
用户注册
创建一个表单#xff0c…本篇是在完成用户登录登出密码修改功能后扩展用户注册功能。
关于用户登录、注销、更改密码和重置密码。请查看
Django身份验证初试-CSDN博客
Django登录注销视图-CSDN博客
Django密码修改和重置视图-CSDN博客
用户注册
创建一个表单让用户输入用户名、真实姓名和密码。 编辑位于account应用程序目录中的forms.py文件
from django.contrib.auth.models import Userclass UserRegistrationForm(forms.ModelForm):password forms.CharField(labelPassowrd,widgetforms.PasswordInput)password2 forms.CharField(labelRepeat passowrd,widgetforms.PasswordInput)class Meta:model Userfields (username,first_name,email)def clean_password2(self):cd self.cleaned_dataif cd[password] ! cd[password2]:raise forms.ValidationError(Passwords dont match.)return cd[password2]
表单中包含username,first_name,email字段这些字段讲根据它们对应的模型进行验证。如果用户填写了一个已经存在的用户名将得到一个验证错误。因为username是一个用uniqueTrue定义的字段。添加password和password2两个字段用来确认密码。定义了一个clean_password2方法用于对照第一个密码检查第二个密码如果密码不匹配则不让表单验证。这个检查是在调用is_valid方法时完成的。 Django可以为任何表单字段提供clean_fieldname()方法清楚特定字段的值或引发表单验证错误。表单还包括一个通用的clean()方法来验证整个表单这对于验证相互依赖的字段非常有用。 Django还提供了一个UserCreationForm表单它位于Django .contrib.auth.forms中和刚才创建的表单非常相似。 编辑account应用程序的views.py文件
from .forms import EmailPostForm,CommentForm,SearchForm,UserRegistrationFormdef register(request):if request.method POST:user_form UserRegistrationForm(request.POST)if user_form.is_valid():new_user user_form.save(commitFalse)new_user.set_password(user_form.cleaned_data[password])new_user.save()template account/register_done.htmlcontext {new_user:new_user}return render(request,template,context)else:user_form UserRegistrationForm()template account/register.htmlcontext {user_form:user_form}return render(request,template,context)
这里没有保存用户输入的原始密码而是使用处理加密的用户模型的set_password()方法进行保存以保证安全。
编辑account应用的urls.py文件添加如下URL模式:
path(register/,views.register,nameregister),
在account/ template目录下创建一个新模板命名为register.html并使其看起来如下:
{% extends base.html %}
{% block title %}Create an account{% endblock %}
{% block content %}h1Create an account/h1pPlease, sign up using the following form:/pform action. methodpost{{ user_form.as_p }}{% csrf_token %}pinput typesubmit valueCreate my account/p/form
{% endblock %}
在同一目录下添加一个模板文件并将其命名register_done.html。将以下代码添加到其中:
{% extends base.html %}
{% block title %}Welcome{% endblock %}
{% block content %}h1Welcome {{ new_user.first_name }}!/h1pYour account has been successfully created. Now you can a href{% url login %}log in/a./p
{% endblock %}
用户模型扩展
编辑account应用程序的models.py文件
from django.db import models
from django.conf import settingsclass Profile(models.Model):user models.OneToOneField(settings.AUTH_USER_MODEL,on_deletemodels.CASCADE)date_of_birth models.DateField(blankTrue, nullTrue)photo models.ImageField(upload_tousers/%Y/%m/%d,blankTrue)def __str__(self):return Profile for user {}.format(self.user.username) 为了保持代码的泛型请使用get_user_model()方法检索用户模型和AUTH_USER_MODEL设置以便在定义模型与用户模型的关系时引用它而不是直接引用auth用户模型。 用户一对一字段允许您将配置文件与用户关联。on_delete参数使用CASCADE这样当用户被删除时它的相关配置文件也会被删除。照片字段是一个ImageField字段。您需要安装Pillow库来处理图像。 在shell中运行以下命令安装Pillow:python -m pip install pillow 为了让Django在开发服务器上为用户上传的媒体文件提供服务在项目的settings.py文件中添加以下设置:
MEDIA_URL /media/
MEDIA_ROOT os.path.join(BASE_DIR, media/)
MEDIA_URL是为用户上传的媒体文件提供服务的基本URL,MEDIA_ROOT是媒体文件所在的本地路径。Django动态地构建相对于项目路径的路径以使代码更加通用。
编辑项目的主urls.py文件修改代码如下:
from django.conf import settings
from django.conf.urls.static import staticif settings.DEBUG:urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT) Django开发服务器将负责在开发过程中提供媒体文件(也就是DEBUG设置为True时)。 static()辅助函数适合于开发但不适合生产使用。永远不要在生产环境中使用Django提供静态文件。 编辑account应用程序的admin.py文件并在管理站点中注册Profile模型如下所示:
from django.contrib import admin
from .models import Profileadmin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):list_display [user,date_of_birth,photo]
让用户在网站上编辑自己的个人资料。
将以下导入和模型表单添加到account应用程序的forms.py文件中:
class UserEditForm(forms.ModelForm):class Meta:model Userfields (first_name,last_name,email)class ProfileEditForm(forms.ModelForm):class Meta:model Profile
UserEditForm:允许用户编辑自己的名字、姓氏和电子邮件这些都是Django内置用户模型的属性。ProfileEditForm:这将允许用户编辑我们保存在自定义概要模型中的概要数据。用户将能够编辑自己的出生日期并上传照片作为个人资料。
编辑account应用程序的views.py文件并导入Profile模型如下所示:
login_required
def edit(request):if request.method POST:user_form UserEditForm(instancerequest.user,datarequest.POST)profile_form ProfileEditForm(instancerequest.user.profile,datarequest.POST,filesrequest.FILES)if user_form.is_valid() and profile_form.is_valid():user_form.save()profile_form.save()else:user_form UserEditForm(instancerequest.user)profile_form ProfileEditForm(instancerequest.user.profile)template account/edit.htmlcontext {user_form:user_form}return render(request,template,context)
使用login_required装饰器是因为用户必须经过身份验证才能编辑他们的配置文件。UserEditForm用于存储内置用户模型的数据ProfileEditForm用于存储自定义概要模型中的附加概要数据。为了验证提交的数据将执行两个表单的is_valid()方法。如果两个表单都包含有效的数据将保存两个表单调用save()方法来更新数据库中相应的对象。
将以下URL模式添加到account应用程序的urls.py文件中:
{% extends base.html %}
{% block title %}Edit your account{% endblock %}
{% block content %}h1Edit your account/h1pYou can edit your account using the following form:/pform action. methodpost enctypemultipart/form-data{{ user_form.as_p }}{{ profile_form.as_p }}{% csrf_token %}pinput typesubmit valueSave changes/p/form
{% endblock %}
表单中包含enctypemultipart/form-data来启用文件上传。 使用HTML表单来提交user_form和profile_form表单。