我的表单实例永远不会有效

时间:2015-07-08 09:34:34

标签: django forms views instance

我在django建立了一个社交网络,而且我在用户创建表单上遇到了麻烦。 这是我的代码:

views.py

def register(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST) #
        if form.is_valid():
            u = UserProfile.objects.create(first_name = form.cleaned_data['first_name'],...)
            u.set_password(u.password)
            u.save()
            return HttpResponseRedirect(...)
        else:
            return Http404
    else:
        form = UserProfileForm()

    return render_to_response(...,
                             {'form': form},
                             context_instance=RequestContext(request))

forms.py

 class UserProfileForm(ModelForm):    
      first_name = forms.CharField(help_text="Por favor, introduzca su nombre",     required=True)
...

class Meta:
    model = UserProfile
    fields = ['first_name',...]

def __init__(self, request=None, *args, **kwargs):
    self.user = kwargs.pop('user', None)
    super(UserProfileForm, self).__init__(*args, **kwargs) 

def validate_user(self):
    first_name_length = len(self.cleaned_data['first_name'])
    ...
    if not first_name_length > 0:
        raise ValidationError("Por favor, introduzca nombre valido")
    ...

models.py

class UserProfile(models.Model):
    first_name = models.CharField(max_length=50, blank=True)...

我正在使用带有form.as_p的模板,但我的表单实例永远不会有效。我究竟做错了什么?谁能帮我?

1 个答案:

答案 0 :(得分:1)

查看表单的签名:

def __init__(self, request=None, *args, **kwargs)

现在看看你如何实例化它:

form = UserProfileForm(request.POST)

因此,您将request.POST作为请求参数传递。

你应该真的避免像这样改变子类的签名。特别是在您的情况下,因为您根本没有使用或传递请求。如果你确实需要这样做,你应该使用从user得到的kwargs值(和你再次使用或传递的那样),所以我不知道你为什么要这么做呢。)