0

我正在尝试为 Web 应用程序的客户端创建一个基本的用户注册系统。

我已经创建了适当的视图和模板来创建一个表单页面,该页面创建一个 Django 用户对象和一个我自己创建的 UserProfile 对象。(这些通过 1-1 字段链接)。

在我的注册页面访问并填写表格后,我点击提交,与初始化UserProfile字段相关的字段将被清除,并且“此字段为必填项”。错误将显示在每个输入框上(尽管之前已正确填写)。如果我再次填写这些选定的字段,然后按提交,注册请求将被正确处理。

在终端中,我为每个表单打印了 is_valid() 的值。在第一次通过时,User 表单返回 true,而 UserProfile 表单返回 false。在第二次提交时,它们都返回 true。

你能帮我理解为什么第二个表格在第一次通过时返回错误并迫使我重新提交吗?

代码如下:

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.forms import ModelForm


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=32)
    email = models.CharField(max_length=100)
    institute = models.CharField(max_length=100)
    address1 = models.CharField(max_length=100)
    address2 = models.CharField(max_length=100)
    city = models.CharField(max_length=100)
    country = models.CharField(max_length=100)
    postal_code = models.CharField(max_length=24)
    description = models.TextField(max_length=2500)

    def __unicode__(self):
        return self.name

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ['username', 'password', 'email']

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['user']

视图.py

def registration(request):
    if request.method == 'POST':
        print('post')
        user_form = UserForm(request.POST, prefix='user')
        profile_form = UserProfileForm(request.POST, prefix='userprofile')
        print('user form ' + str(user_form.is_valid()))
        print('profile form ' + str(profile_form.is_valid()))
        if user_form.is_valid() and profile_form.is_valid():
            print('both valid')
            user = user_form.save(commit=False)
            user.is_active = False
            user.save()
            userprofile = profile_form.save(commit=False)
            userprofile.user = user
            userprofile.save()
            print('success')
            return HttpResponseRedirect('registration-success/')
    else:
        print('unbound')
        user_form = UserForm(prefix='user')
        profile_form = UserProfileForm(prefix='profile')
    context = { 'userform': user_form,
                'userprofileform': profile_form,}
    return render(request, 'registration/register.html', context)

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

模板.html

<!DOCTYPE html>
<html>
<body>
    <h2> Registration </h2>


    <form method="POST">
        {% csrf_token %}
        {{userform}}
    </br></br>
        {{userprofileform}}
        <input type="submit" value="Submit"/>
    </form>
    <a href="password_reset/" id="forgot"> forgot username/password</a><br />
    <a href="register" id="new">new user</a>
</body>
</html>
4

1 回答 1

0

在您的 POST 代码路径中,您有以下内容:

    profile_form = UserProfileForm(request.POST, prefix='userprofile')

在您的 else 代码路径中,这是:

    profile_form = UserProfileForm(prefix='profile')

前缀值需要匹配,以便 POST 数据正确绑定到配置文件表单。它适用于您的重新提交,因为它通过 POST 代码路径,因此模板中使用的 id 与表单对象期望的匹配。

于 2013-07-16T23:55:26.247 回答