扩展User和UserCreationForm

时间:2013-05-17 11:45:14

标签: python django

我需要你的帮助。 我扩展类User并添加相同的字段,而不是扩展UserCreationForm,但表单无效。 如果form.is_valid(),代码崩溃。 请帮忙,为什么我的表格不正确?

models.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, related_name='profile')
    nick_name = models.CharField(max_length=15)

我的注册表格

forms.py

class MyRegisterForm(UserCreationForm):
print "OK!"
nick_name = forms.CharField(max_length=30, required=True, widget=forms.TextInput)
print "Ook"
class Meta:
    model = UserProfile
def save(self, commit=True):
    if not commit:
        raise NotImplementedError("Can't create User and UserProfile without database save")
    print "Saving..."
    user = super(MyRegisterForm, self).save(commit=False)
    user.nick_name = self.cleaned_data["nick_name"]
    user_profile = UserProfile(user=user, nick_name=self.cleaned_data['nick_name'])
    user_profile.save()
    print "Saving complete"
    return user, user_profile

注册功能

views.py

def reg(request):
    if request.method =='POST':
        form = MyRegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            print username
            password1 = form.cleaned_data['password1']
            print password1
            password2 = form.cleaned_data['password2']
            print password2
            nick_name = form.cleaned_data['nick_name']
            print nick_name
            form.clean_username()
            if password1 == password2:
                new_user = form.save()
                return render_to_response('registration/registration_complete.html')
            else:
                print "Password error"
                return render_to_response('registration/registration_fail.html')
        else:
            print "FORM error" #ТУТ ВАЛИТСЯ :(
            return render_to_response('registration/registration_fail.html')
    else:
        form = UserCreationForm() # An unbound form
    return render_to_response('registration/registration_new_user.html', {
        'form': form,
        },context_instance=RequestContext(request))

在设置中

settings.py

AUTH_PROFILE_MODULE = 'registration.UserProfile'

注册模板

registration_new_user.html

    {% extends "base.html" %}
{% block content %}
  <h1>Registration</h1>
  <form action="registration" method="post">
    {% if form.error_dict %}
      <p class="error">Please fix the error.</p>
    {% endif %}
    {% if form.username.errors %}
      {{ form.username.html_error_list }}
    {% endif %}
    <label for="id_username">Login:</label><br> {{ form.username }}<br>
    {% if form.password1.errors %}
      {{ form.password1.html_error_list }}
    {% endif %}
    <label for="id_password1">pass:</label><br> {{ form.password1 }}<br>
    {% if form.password2.errors %}
      {{ form.password2.html_error_list }}
    {% endif %}
    <label for="id_password2">pass(again):</label><br> {{ form.password2 }}<br>
    {% if form.nick_name.errors %}
      {{ form.nick_name.html_error_list }}
    {% endif %}
    <label for="id_nick_name">nick:</label><br> {{ form.nick_name }}<br>
      <br>
    <input type="submit" value="Reg" />
  </form>
{% endblock %}

1 个答案:

答案 0 :(得分:0)

嗯,您的代码中有几个问题。例如,您使用UserCreationForm覆盖MyRegistrationForm,并且当请求为POST时确实会实例化后者,但如果不是,则将模板传递给普通UserCreationForm

user中有UserCreationForm,因为这是ModelForm,其模型为UserProfile,并且您已定义user字段。因此,当您使用POST创建表单时,表单会对此产生抱怨。

我在这里看不到一个非常清晰的解决方案,因为您的代码有些棘手,但首先,请同时使用GETPOST请求类型的相同表单,以便在您的视图中使用此行< / p>

form = UserCreationForm() # An unbound form

会改变这个:

form = MyRegistrationForm() # An unbound form

在模板中,它不会显示在字段user中,因为您不包含它们,但它在表单中。在创建新用户时,该字段应设置为不需要,因为您正在创建用户,因此没有用户与UserProfile关联。您可以将其设置为非必需,将参数blank=True添加到模型中:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, related_name='profile', blank=True)
    nick_name = models.CharField(max_length=15)

<强>更新

这是您的基类UserCreationForm save方法的代码:

def save(self, commit=True):
    user = super(UserCreationForm, self).save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    if commit:
        user.save()
    return user

如您所见,此代码假定用户具有set_password属性,为了解决此问题,您必须向def set_password(self, raw_password)类添加UserProfile方法。发生此错误是因为表单基类设计用于普通Django User类,您可能遇到的任何其他错误,您可能会通过添加UserProfile所需的字段来解决它。这个解决方法如下:

class UserProfile:
    ...
    def set_password(self, raw_password):
        # whatever logic you need to set the password for your user or maybe
        self.user.set_password(raw_password)
    ...

我希望这能为问题带来一些启示。祝你好运!