用户 ModelForm 没有保存在数据库中(Django)

User ModelForm not getting saved in database (Django)

我有一个创建自定义用户实例的 ModelForm(AbstractUser 模型)。每当我尝试提交表单时,除了重新加载页面(由于操作)之外什么都没有发生,并且数据库中没有任何内容。代码如下:

def sign_up(request):
    if request.method == 'POST':
        print("test")
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            data = form.cleaned_data
            user = authenticate(
                username=data['username'],
                password=data['password']
            )
            user_login(request, user)
    else:
        form = UserForm()
    return render(request, 'schedules/signup/signup.html', {'form':form})
class ClientUser(AbstractUser):
    classes = models.ManyToManyField(ScheduleClass)
    personal_changes = models.TextField(name="personal_changes", default="none")
    schedule = models.ManyToManyField(Schedule)
    def get_classes(self):
        return self.classes
class UserForm(forms.ModelForm):

    class Meta:
        model = ClientUser
        fields = ['username', 'password', 'classes', 'schedule']
        <form method="post" action="http://127.0.0.1:8000/">
            {% csrf_token %}
            {{ form }}
            <input type="submit">
        </form>

出于某种原因,即使我 post,它也不会打印我在 sign_up 函数的第 3 行写的那一行。我做错了什么吗?

好的,所以你说你的印刷品没有显示,所以首先让你的表单操作与网站相关,在这里使用 django 的 {% url 模板标签通常是个好主意,或者只是将其留空到 post 到当前 URL;

        <form method="post" action="">
            {% csrf_token %}
            {{ form }}
            <input type="submit">
        </form>

现在,如果您使用 POST 请求点击视图并且表单无效,那么当页面再次呈现时,您此时正在做的事情将不会包含任何错误,因此它'看起来好像什么都没发生,但实际上您确实尝试验证表单,您只是没有 return 向用户报告错误。

调用 form.is_valid() 后,如果 form 实例无效,则会向该实例添加错误。因此,表单实例的状态非常重要,您需要将其传回给用户,而不是创建一个新实例,这就是您消除错误的方式。

你会做这样的事情;

def sign_up(request):
    # Create the form for a GET request
    form = UserForm()

    if request.method == 'POST':
        # Recreate the form instance with the POST data
        form = UserForm(request.POST)
        # Run form validation
        if form.is_valid():
            form.save()
            data = form.cleaned_data
            user = authenticate(
                username=data['username'],
                password=data['password']
            )
            user_login(request, user)

    # if you end up here on a POST request, the form isn't valid but still contains the errors
    return render(request, 'schedules/signup/signup.html', {'form':form})