不使用表单中的id隐藏字段进行编辑?

时间:2012-06-29 17:45:32

标签: django

我不确定这是否是编写编辑的最简洁方法。但经过数小时的研究,这是我能想到的最好的。但是我不喜欢这样的事实:我必须将id存储在一个隐藏字段中,只是为了再次检索它以实际更新模型。

有更有效的方法吗?

def edit_contact_view(request):
    profile = request.user.get_profile()
    if 'id' in request.GET:
        try:
            id = request.GET['id']
            contacts = profile.company.contact_set.all()
            form = ContactsForm(profile.company, instance=contacts.get(id=id))
            form.data['id'] = id
            variables = RequestContext(request, {'form':form })
            return render_to_response("contact.html", variables)
        except Contact.DoesNotExist:
            raise Http404(_(u'Contact not found'))
    else:
        if request.method == 'POST':
            form = ContactsForm(profile.company, request.POST)
            if form.is_valid():
                contacts = profile.company.contact_set.all()
                contact = contacts.get(id=form.cleaned_data['id'])
                contact.last_name = form.cleaned_data['last_name']
                contact.save()
    return HttpResponseRedirect('/')

2 个答案:

答案 0 :(得分:3)

是的,你使这变得比它需要的更复杂。

首先,在Django中,更常见的是在URL本身中传递id,而不是在GET参数中传递 - 例如/contact/edit/3/而不是/contact/edit?id=3。请参阅示例this question,了解如何配置此类网址。

其次,无论你采用哪种方式,都不需要在隐藏变量中传递id,因为它已经可以从URL中获得。你总是可以从那里获得实例。

第三,我假设ContactForm是一个ModelForm,但你没有使用save功能,这进一步简化了事情。

全部放在一起:

def edit_contact_view(request, id=None):
    profile = request.user.get_profile()
    if id is not None:
        contact = get_object_or_404(Contact, pk=id)
    else:
        contact = Contact(company=profile.company)
    if request.POST:
       form = ContactForm(request.POST, instance=contact)
       if form.is_valid():
           contact = form.save()
           return redirect(...)

    else:
        form = ContactForm(instance=contact)
    return render_to_response('contact.html', {'form': form})

答案 1 :(得分:2)

我必须在这里遗漏一些内容,但为什么不在网址中对id进行编码呢?

即。在urls.py

url('^/contact/?P<contact_id>[0-9]+)/edit/$', edit_contact_view, name='edit_contact_view')

你的观点:

def edit_contact_view(request, contact_id):
    profile = request.user.get_profile()
    contact = get_object_or_404(Contact, id=contact_id)
    if contact not in profile.company.contact_set.all():
        return Http404

并在您的模板中

<form method="POST">
   {{ form.as_p }}
   ...
</form>