Django新手求助:如何创建含自定义字段的注册表单
实现Django自定义学校注册表单的完整步骤
嘿,作为Django新手想自定义注册表单太正常了,默认的用户表单确实满足不了个性化需求,我一步步带你实现你要的这个学校注册功能~
1. 先扩展用户模型(关键!)
因为你需要的字段(学校名称、联系人职位等)是默认User模型没有的,所以我们用AbstractUser扩展一个自定义用户模型,这样能保留默认的用户名、邮箱、密码字段,同时添加你的自定义字段。
在你的app的models.py里添加:
from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): # 定义职位选项,和你HTML里的选项对应 DESIGNATION_CHOICES = [ ('', '请选择'), ('Principal', 'Principal'), ('Founder', 'Founder'), ('Management', 'Management'), ('Teachers', 'Teachers'), ('Others', 'Others'), ] school_name = models.CharField(max_length=255, verbose_name="School Name") cf_school = models.CharField(max_length=255, verbose_name="Can't find your School") contact_person_name = models.CharField(max_length=255, verbose_name="Contact person Name") designation = models.CharField(max_length=50, choices=DESIGNATION_CHOICES, verbose_name="Designation at School") phone = models.CharField(max_length=20, verbose_name="Mobile No.") # 可选:修改后台显示的名称 class Meta: verbose_name = "Custom User" verbose_name_plural = "Custom Users"
然后必须在settings.py里指定自定义用户模型:
AUTH_USER_MODEL = '你的app名称.CustomUser'
之后记得执行数据库迁移:
python manage.py makemigrations python manage.py migrate
2. 创建自定义注册表单类
接下来我们写一个表单类,关联刚才的CustomUser模型,还要添加确认密码的字段并验证。
在app的forms.py里创建:
from django import forms from django.contrib.auth.forms import UserCreationForm from .models import CustomUser class SchoolRegistrationForm(UserCreationForm): # 添加确认密码字段,对应你的HTML需求 confirm_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Confirm Password *'})) class Meta: model = CustomUser fields = [ 'school_name', 'cf_school', 'contact_person_name', 'designation', 'email', 'phone', 'password1' ] # 给字段添加HTML属性,匹配你的表单样式 widgets = { 'school_name': forms.TextInput(attrs={'placeholder': 'Type few letter & select from down *', 'class': 'form-control ui-autocomplete-input', 'autocomplete': 'off'}), 'cf_school': forms.TextInput(attrs={'placeholder': "Can't find your School *", 'class': 'form-control'}), 'contact_person_name': forms.TextInput(attrs={'placeholder': 'Contact person Name *', 'class': 'form-control'}), 'designation': forms.Select(attrs={'class': 'form-control'}), 'email': forms.EmailInput(attrs={'placeholder': 'Please enter your email *', 'class': 'form-control'}), 'phone': forms.TextInput(attrs={'placeholder': 'Please enter your Mobile No *', 'class': 'form-control'}), 'password1': forms.PasswordInput(attrs={'placeholder': 'Enter your Password *', 'class': 'form-control'}), } def clean(self): cleaned_data = super().clean() password = cleaned_data.get("password1") confirm_password = cleaned_data.get("confirm_password") if password != confirm_password: raise forms.ValidationError("密码和确认密码不匹配!") return cleaned_data
3. 编写处理注册的视图函数
在app的views.py里写视图,处理表单的GET和POST请求:
from django.shortcuts import render, redirect from .forms import SchoolRegistrationForm def register_school(request): if request.method == 'POST': form = SchoolRegistrationForm(request.POST) if form.is_valid(): form.save() # 注册成功后重定向到登录页,这里的login是你自己的登录URL名称 return redirect('login') else: form = SchoolRegistrationForm() return render(request, 'registration/school_register.html', {'form': form})
4. 配置URL路由
在项目的urls.py或者app的urls.py里添加路由:
from django.urls import path from .views import register_school urlpatterns = [ # 其他路由... path('addyourschool/', register_school, name='register_school'), # 你的登录路由示例 path('login/', # 替换成你的登录视图路径, name='login'), ]
5. 编写模板文件(适配你的HTML)
把你提供的HTML改成Django模板,保存为templates/registration/school_register.html:
<form id="contact-form" method="post" action="{% url 'register_school' %}" role="form"> {% csrf_token %} <div class="messages"></div> <div class="controls"> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="form_name">{{ form.school_name.label }} *</label> {{ form.school_name }} {% if form.school_name.errors %} <div class="help-block with-errors">{{ form.school_name.errors }}</div> {% endif %} </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="form_cfschp">{{ form.cf_school.label }} *</label> {{ form.cf_school }} {% if form.cf_school.errors %} <div class="help-block with-errors">{{ form.cf_school.errors }}</div> {% endif %} </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="Pessonname">{{ form.contact_person_name.label }} *</label> {{ form.contact_person_name }} {% if form.contact_person_name.errors %} <div class="help-block with-errors">{{ form.contact_person_name.errors }}</div> {% endif %} </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="DesignationatSchool">{{ form.designation.label }} *</label> {{ form.designation }} {% if form.designation.errors %} <div class="help-block with-errors">{{ form.designation.errors }}</div> {% endif %} </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="pwd">Password *</label> {{ form.password1 }} {% if form.password1.errors %} <div class="help-block with-errors">{{ form.password1.errors }}</div> {% endif %} </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="pwd">Confirm Password *</label> {{ form.confirm_password }} {% if form.confirm_password.errors %} <div class="help-block with-errors">{{ form.confirm_password.errors }}</div> {% endif %} </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group"> <label for="email">{{ form.email.label }} *</label> {{ form.email }} {% if form.email.errors %} <div class="help-block with-errors">{{ form.email.errors }}</div> {% endif %} </div> </div> <div class="col-md-6"> <div class="form-group"> <label for="tel">{{ form.phone.label }} *</label> {{ form.phone }} {% if form.phone.errors %} <div class="help-block with-errors">{{ form.phone.errors }}</div> {% endif %} </div> </div> </div> <div class="col-md-12"> <div class="text-center"> <input type="submit" class="btn btn-success btn-send" value="Register"> </div> <div class="text-center">Already Registered / have an account? <a href="{% url 'login' %}">Login here</a></div> </div> </div> </form>
一些注意事项
- 如果你需要学校名称的自动补全功能(HTML里的
ui-autocomplete-input),可以后续集成jQuery UI的autocomplete,或者Django第三方库比如django-autocomplete-light。 - 确保你的模板目录在
settings.py的TEMPLATES配置里被正确识别。 - 测试时记得检查表单验证是否生效(比如密码不匹配、必填字段为空时的错误提示)。
内容的提问来源于stack exchange,提问作者Pradeep Shetty
相关产品推荐
相关产品推荐

