我正在尝试在前面创建一个“编辑个人资料”表单。会发生什么是我的表单(我不是100%肯定)尝试创建用户而不是找到当前用户并更新他的个人资料。所以我认为这就是问题所在。在这里检查了很多问题,但没有一个是清楚的。我正在尝试编辑的字段是电子邮件,名字和姓氏。 (另外我想添加uda
forms.py
class UpdateProfile(forms.ModelForm):
username = forms.CharField(required=True)
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False)
last_name = forms.CharField(required=False)
class Meta:
model = User
fields = ('username', 'email', 'first_name', 'last_name')
def clean_email(self):
username = self.cleaned_data.get('username')
email = self.cleaned_data.get('email')
if email and User.objects.filter(email=email).exclude(username=username).count():
raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
return email
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
views.py
def update_profile(request):
args = {}
if request.method == 'POST':
form = UpdateProfile(request.POST)
form.actual_user = request.user
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('update_profile_success'))
else:
form = UpdateProfile()
args['form'] = form
return render(request, 'registration/update_profile.html', args)
答案 0 :(得分:18)
你非常接近。在实例化表单时,需要将正在修改的User
对象作为instance
参数传递。
来自文档:
ModelForm的子类可以接受现有的模型实例作为 关键字参数
instance
;如果提供了这个,save()将更新 那个例子。
在您的代码中,它看起来像:
form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
...
您可以在此处查看更多信息:https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/#the-save-method
答案 1 :(得分:5)
或者,如果你想使用UpdateView,你可以使用UpdateView,你可以在views.py中执行类似的操作:
class UpdateProfile(UpdateView):
model = MyProfile
fields = ['first_name', 'last_name', 'image', 'url', 'biography', '...'] # Keep listing whatever fields
# the combined UserProfile and User exposes.
template_name = 'user_update.html'
slug_field = 'username'
slug_url_kwarg = 'slug'
你在models.py中的MyProfile有这样的东西:
class MyProfile(AbstractUser):
image = models.ImageField(upload_to='uploads/profile/')
url = models.URLField()
biography = models.CharField(max_length=1000)
和你的urls.py一样(假设你正在使用django allauth并想要遵守url约定):
....
url(r'^accounts/update/(?P<slug>[\-\w]+)/$', views.UpdateProfile.as_view(), name='update_user'),
....
剩下的就是Django的乐趣!如果可以用于基本的CRUD任务,我会建议你编写更少的代码,除非它真的需要做一些自定义的事情,即使你仍然可以通过扩展基于类的视图来逃避。
如果您有更多信息,请参阅此处:Django Docs on Class Based Views