You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:47:26