我有一个'帐户'应用,其中包含一个自定义User
模型,一个将OneToOneField保存到Profile
的{{1}}模型。创建用户实例时,也会自动创建相关的配置文件实例。
现在我设计了一个页面,其中包含一个表单,用于为现有用户编辑三个配置文件。当用户请求像'accounts / profile_edit / 1 /'这样的网址时,如果请求用户是合法的,我首先得到他们三个字段的旧配置文件数据,然后响应一个编辑页面,其中旧数据作为初始值。形式。
我当前的解决方案工作正常,但我认为它不优雅,可能包含一些不必要的数据库查询浪费。主要有两种方式:
我将旧的个人资料数据作为个人资料编辑表单的初始值的方式。
我保存现有个人资料的编辑数据的方式。
因此,如果有人可以给我任何建议,那将是一种贬义。
urls.py,views.py,models.py和forms.py fiels是:
User
答案 0 :(得分:1)
您可以在实例化表单时传递instance
参数。在这种情况下,您不必创建dict来填充表单,也不必遍历字段来保存它们。
您的观点可以更改为
def profile_edit(request,
template_name,
user_id,
edit_form=ProfileForm,):
if not request.user.is_authenticated():
return HttpResponseRedirect(reverse('accounts:login'),
)
#ensure the request user is the edit user
if request.user.pk!=int(user_id):
raise Http404
if request.method == 'POST':
form = edit_form(data=request.POST, instance=request.user.profile)
if form.is_valid():
#no need for edit method
updated_profile = form.save()
return HttpResponseRedirect(reverse('accounts:profile',kwargs={'user_id':user_id}))
else:
#no need to crate dict
form = edit_form(instance=request.user.profile)
context = {
'form': form,
}
return TemplateResponse(request, template_name, context,)