我不确定这是否是编写编辑的最简洁方法。但经过数小时的研究,这是我能想到的最好的。但是我不喜欢这样的事实:我必须将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('/')
答案 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>