Django中如何在函数视图与类视图间传递ID?
别担心,这个问题其实很常见,我来帮你搞定!核心问题就是如何把URL里的订阅记录ID传递到FormWizard的done方法里,这样就能找到要更新的那条记录了。下面给你两种可行的方案,选你觉得顺手的就行:
方案一:直接通过视图参数传递ID(推荐)
这种方法逻辑更清晰,明确传递参数,不容易出问题:
- 修改
wizard_edit视图,在调用Wizard视图时把ID传进去:
from django.shortcuts import get_object_or_404 def wizard_edit(request, id): # 用get_object_or_404替代get,避免ID不存在时抛出异常 sub = get_object_or_404(Subscribers, id=id) initial = { '0': {'industry_search':sub.industry}, '1': {'city':sub.city, 'kilometers':sub.kilometers, 'street_1':sub.street_1, 'street_2':sub.street_2}, '2': {'email':sub.email} } wiz = ContactWizardUpdate.as_view([ContactForm1, ContactForm2, ContactForm3], initial_dict=initial) # 把id作为参数传给Wizard视图 return wiz(request, id=id)
- 更新
ContactWizardUpdate类的done方法,从self.kwargs里拿到ID,再传给更新函数:
class ContactWizardUpdate(SessionWizardView): template_name = 'service/subscribe.html' form_list = [ContactForm1, ContactForm2, ContactForm3] def done(self, form_list, **kwargs): # 从视图参数里获取订阅记录ID sub_id = self.kwargs['id'] # 调用更新函数,传入ID和表单数据 update_the_form_data(sub_id, form_list) return render(self.request, 'service/done.html')
- 修正
update_the_form_data函数,去掉多余的self参数,换成接收ID:
def update_the_form_data(sub_id, form_list): form_data = [form.cleaned_data for form in form_list] # 根据ID获取要更新的记录 foo = get_object_or_404(Subscribers, id=sub_id) # 把表单数据赋值给记录字段 foo.industry = form_data[0]['industry_search'] foo.city = form_data[1]['city'] foo.kilometers = form_data[1]['kilometers'] foo.street_1 = form_data[1]['street_1'] foo.street_2 = form_data[1]['street_2'] foo.email = form_data[2]['email'] # 保存更新 foo.save()
方案二:从request的URL解析结果获取ID
如果不想修改wizard_edit的传参逻辑,也可以直接从request对象里提取URL参数:
class ContactWizardUpdate(SessionWizardView): template_name = 'service/subscribe.html' form_list = [ContactForm1, ContactForm2, ContactForm3] def done(self, form_list, **kwargs): # 从request的URL解析结果里获取ID sub_id = self.request.resolver_match.kwargs['id'] update_the_form_data(sub_id, form_list) return render(self.request, 'service/done.html')
(注:此方案下update_the_form_data函数的修改和方案一一致)
两种方法都能解决你的问题,第一种更直观,第二种更简洁。另外提醒下,用get_object_or_404替代直接get,可以避免ID不存在时抛出服务器错误,而是返回友好的404页面。
内容的提问来源于stack exchange,提问作者asdf123
相关产品推荐
相关产品推荐

