3

我不确定这是否是最干净的编辑方式。但经过数小时的研究,这是我能想到的最好的。但是,我不喜欢我必须将 id 存储在隐藏字段中才能再次将其作为 POST 检索以实际更新模型的事实。

有没有更有效的方法来做到这一点?

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('/')
4

2 回答 2

4

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

首先,在 Django 中,更常见的是在 URL 本身中传递 id,而不是在 GET 参数中 - 例如/contact/edit/3/,而不是/contact/edit?id=3. 例如,请参阅此问题以了解如何配置这样的 URL。

其次,无论您采用哪种方式,都无需在隐藏变量中传递 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})
于 2012-06-29T18:15:46.803 回答
2

我一定在这里遗漏了一些东西,但你为什么不按照标准对 url 中的 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>
于 2012-06-29T18:10:50.457 回答