我目前正在研究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>
感谢您花时间阅读本文。任何帮助/指针都非常感谢!
答案 0 :(得分:0)
您的模板不包含您的gravitarLink
字段。由于模型字段未使用blank=True
声明,因此该字段是必填字段,因此您的表单永远无效。
请注意,通常认为更好的做法是不要将null=True
用于字符字段,其中URLField
是子集。相反,如果您希望它们是可选的设置blank=True
并将null
保留为其默认值False
,那么空字符串就是空值。 blank=True
是必需的; null
只控制哪些数据库表示有效。
此外,更好的做法是在出现错误时将绑定的form
对象传递回模板,而不是创建新的空对象。这不仅包括您先前提交的值,因此用户不必重新输入有效值,但可以显示每个字段的错误。关于“在视图中使用表单”的Django文档演示了通常的模式。