Django - 更新UserProfile总是返回Not_Valid()

时间:2013-11-10 22:51:53

标签: django django-models django-forms django-views django-users

我目前正在研究Django项目。这是我对Python / Django的第一次介绍,所以我正在学习绳索。希望大家都能帮忙!

我目前正在尝试通过模型,视图和模板更新我在UserProfile模型中设置的一些自定义字段。现在似乎无论我对View做了什么,返回的形式总是回归无效。我已经盯着这个很长一段时间了,所以这可能没有帮助。这是代码:

models.py

 class UserProfile(models.Model):
    #inherit the base User model
    user = models.OneToOneField(User)

    #custom fields to be in the User model
    phoneNumber = models.IntegerField(null=True)
    about = models.TextField(null=True)
    gitHubLink = models.URLField(null=True)
    linkedInLink = models.URLField(null=True)
    gravitarLink = models.URLField(null=True)
    facebookLink = models.URLField(null=True)
    rating = models.PositiveSmallIntegerField(default=0)

    def __unicode__(self):
        return u'Profile of user: %s' % self.user.username

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])


def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

views.py

@login_required
def edit_profile(request):
    profile = request.user.get_profile()

    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance=profile)
        if form.is_valid():
            userprofile = form.save(commit=False)
            userprofile.user = request.user
            userprofile.save()
            messages.success(request, "Account Updated!")
            return render_to_response('profile/edit.html', {"form": form}, context_instance=RequestContext(request))
        else:
            form = UserProfileForm()
            messages.error(request, "There are form errors.")
            return render_to_response('profile/edit.html', {"form": form}, context_instance=RequestContext(request))
    else:
        form = UserProfileForm(instance=profile)
        return render_to_response('profile/edit.html', {"form": form}, context_instance=RequestContext(request))

forms.py

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('phoneNumber', 'about', 'gitHubLink', 'linkedInLink', 'gravitarLink', 'facebookLink')

    def save(self, commit=True):
        userprofile = super(UserProfileForm, self).save(commit=False)
        userprofile.phoneNumber = self.cleaned_data['phoneNumber']

        if commit:
            userprofile.save()
        return userprofile

edit.html(模板)

<form action="/profile/edit/" method="post" class="form-signin">
    {% csrf_token %}
    <div class="form-group">{{ form.phoneNumber|add_class:"form-control"|attr:"placeholder:Phone Number" }} </div>
    <div class="form-group">{{ form.gitHubLink|add_class:"form-control"|attr:"placeholder:GitHub Account URL" }} </div>
    <div class="form-group">{{ form.facebookLink|add_class:"form-control"|attr:"placeholder:Facebook Account URL" }} </div>
    <div class="form-group">{{ form.linkedInLink|add_class:"form-control"|attr:"placeholder:LinkedIn Account URL" }} </div>
    <div class="form-group">{{ form.about|add_class:"form-control"|attr:"placeholder:About Yourself. Interests, Hobbies, etc.." }} </div>
    <button class="btn btn-lg btn-success btn-block" type="submit">Save Changes</button>
</form>

感谢您花时间阅读本文。任何帮助/指针都非常感谢!

1 个答案:

答案 0 :(得分:0)

您的模板不包含您的gravitarLink字段。由于模型字段未使用blank=True声明,因此该字段是必填字段,因此您的表单永远无效。

请注意,通常认为更好的做法是不要将null=True用于字符字段,其中URLField是子集。相反,如果您希望它们是可选的设置blank=True并将null保留为其默认值False,那么空字符串就是空值。 blank=True是必需的; null只控制哪些数据库表示有效。

此外,更好的做法是在出现错误时将绑定的form对象传递回模板,而不是创建新的空对象。这不仅包括您先前提交的值,因此用户不必重新输入有效值,但可以显示每个字段的错误。关于“在视图中使用表单”的Django文档演示了通常的模式。