You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何在函数视图与类视图间传递ID?

别担心,这个问题其实很常见,我来帮你搞定!核心问题就是如何把URL里的订阅记录ID传递到FormWizard的done方法里,这样就能找到要更新的那条记录了。下面给你两种可行的方案,选你觉得顺手的就行:

方案一:直接通过视图参数传递ID(推荐)

这种方法逻辑更清晰,明确传递参数,不容易出问题:

  1. 修改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)
  1. 更新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')
  1. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:05:59