django 1.6.1,Form,是否有一种优雅的方式来渲染旧数据并从模型中编辑旧数据?

时间:2014-01-13 04:44:56

标签: django

我有一个'帐户'应用,其中包含一个自定义User模型,一个将OneToOneField保存到Profile的{​​{1}}模型。创建用户实例时,也会自动创建相关的配置文件实例。

现在我设计了一个页面,其中包含一个表单,用于为现有用户编辑三个配置文件。当用户请求像'accounts / profile_edit / 1 /'这样的网址时,如果请求用户是合法的,我首先得到他们三个字段的旧配置文件数据,然后响应一个编辑页面,其中旧数据作为初始值。形式。

我当前的解决方案工作正常,但我认为它不优雅,可能包含一些不必要的数据库查询浪费。主要有两种方式:

我将旧的个人资料数据作为个人资料编辑表单的初始值的方式。

我保存现有个人资料的编辑数据的方式。

因此,如果有人可以给我任何建议,那将是一种贬义。

urls.py,views.py,models.py和forms.py fiels是:

User

1 个答案:

答案 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,)