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

Django CBV中如何将get_context_data()参数传递给ModelForm

实现方案

1. 调整路由与跳转逻辑,关联Supplement实例

首先需要在文件上传页的URL规则中增加slug路径参数,确保上传视图能定位到对应的Supplement配置:

# urls.py 中对应FormCompareTransporteur的路由配置
path('upload-transporteur/<slug:slug>/', FormCompareTransporteur.as_view(), name='upload-transporteur'),

同时在UserSupplementTransporterView对应的模板tool/transporter-detail.html中,跳转到上传页的链接需要携带当前Supplement的slug参数:

<a href="{% url 'tool:upload-transporteur' slug=supplement.slug %}">上传对比文件</a>

2. 修改上传视图,向表单传递动态初始值

重写FormCompareTransporteur视图的get_form_kwargs方法,根据URL传入的slug查询对应的Supplement实例,将header_row值注入表单初始化参数:

class FormCompareTransporteur(RequestFormMixin, CreateView):
    """Implémente la première étape : le téléchargement du fichier."""
    template_name = 'tool/upload-fichier-transporteur.html'
    form_class = CompareFormTransporteur
    success_url = reverse_lazy('tool:upload-columns-selection')

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # 从URL路径参数获取slug,查询对应Supplement实例
        supplement = get_object_or_404(Supplement, slug=self.kwargs['slug'])
        # 将header_row值传入表单初始化参数
        kwargs['header_row_initial'] = supplement.header_row
        return kwargs

3. 调整表单逻辑,接收参数设置字段初始值

修改CompareFormTransporteur的__init__方法,接收传入的动态初始值,替换原有写死的固定值2,同时保留默认值兜底兼容其他调用场景:

class CompareFormTransporteur(forms.ModelForm):
    file = forms.FileField(label="Fichier CSV", required=True)
    header_row = forms.IntegerField(label="Header row", required=True)

    class Meta:
        model = CheckFile
        fields = ['file',]

    def __init__(self, request, header_row_initial=2, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request
        # 用动态传入的值设置字段初始值,无传入时默认用2兜底
        self.initial['header_row'] = header_row_initial

    def clean(self):
        super().clean()
        extension = os.path.splitext(self.request.FILES['file'].name)[1]
        integer = self['header_row'].value()
        if extension in ['.xlsx', '.xls']:
            uploaded = parse_excel(self.request.FILES['file'], rowheader=integer)
        elif extension == ".csv":
            uploaded = parse_csv(self.request.FILES['file'])
        elif extension == ".xml":
            uploaded = parse_xml(self.request.FILES['file'])

        self.request.session['uploaded'] = uploaded
        self.request.session['profile'] = self.cleaned_data.get('profile')

说明:不推荐用session传值的方案,用户如果直接收藏上传页链接、或清空session后访问,会出现取值失败的问题,上述URL传参+视图查询的方案稳定性更高。

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.05 16:18:28