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
相关产品推荐
相关产品推荐

