Django编辑用户配置文件
我正在尝试在前面创建一个“编辑配置文件”表单。结果是,我的表单(我不是100%确定)尝试创建一个用户,而不是查找当前用户并更新其配置文件。所以我认为这就是问题所在。在这里检查了许多问题,但没有一个问题足够清楚。我试图编辑的字段是email、first name和last name。(我还要补充一点。) forms.pyDjango编辑用户配置文件,django,edit,profile,Django,Edit,Profile,我正在尝试在前面创建一个“编辑配置文件”表单。结果是,我的表单(我不是100%确定)尝试创建一个用户,而不是查找当前用户并更新其配置文件。所以我认为这就是问题所在。在这里检查了许多问题,但没有一个问题足够清楚。我试图编辑的字段是email、first name和last name。(我还要补充一点。) forms.py class UpdateProfile(forms.ModelForm): username = forms.CharField(required=True) e
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)
非常接近。实例化表单时,需要将要修改的
用户
对象作为实例
参数传递
从文档中:
ModelForm的子类可以接受现有模型实例作为
关键字参数实例
;如果提供了该参数,则save()将更新
那个例子
在您的代码中,它看起来像:
form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
...
您可以在此处签出更多信息:或者,如果您想使用基于类的视图方式,使用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)
和您的url.py类似(假设您使用django allauth并希望遵守url约定):
。。。。
url(r'^accounts/update/(?P[\-\w]+)/$),views.UpdateProfile.as\u view(),name='update\u user'),
....
剩下的是Django乐趣!我建议您为基本CRUD任务编写更少的代码,除非确实需要做一些自定义的事情,即使您仍然可以通过扩展基于类的视图来摆脱这种情况
如果您想了解更多信息,请参见此处:在这种情况下,从基于类的视图中查看UpdateView可能会容易得多。我知道这在不久前就得到了回答,但如果您能解释slug,那就太好了。顺便说一句,回答得很好。@Almosta初学者也许这会有所帮助:我确实读过,我理解slug是什么,但我不理解我想通过你的方法实现同样的目标,但不断地出错。我会发布对我有用的东西。
....
url(r'^accounts/update/(?P<slug>[\-\w]+)/$', views.UpdateProfile.as_view(), name='update_user'),
....