Django表单传入pk参数打印正常,调用方法时获取默认值问题
问题根源
你遇到的是Django表单类属性加载时机的常见坑:
如果你在MappingForm的字段定义处(比如fl_col_header字段的choices参数)直接调用了GetCsvHeadersAndSamples(pk),这行代码会在表单类首次加载的时候就执行,远早于表单实例的__init__方法运行。这时候你还没有从kwargs中弹出传入的pk值,函数拿到的自然是你设置的默认值Rien。你在__init__里打印的pk是实例化阶段才拿到的正确值,所以会出现两者不一致的情况。
解决方案
步骤1:移除类定义阶段的动态choices
把需要动态生成choices的字段的choices参数先设为空列表,不要在类定义阶段调用GetCsvHeadersAndSamples:
class MappingForm(forms.ModelForm): # 仅需要动态生成choices的字段加这行配置,其余字段保持不变 fl_col_header = forms.ChoiceField(choices=[]) class Meta: model = MappingField fields = ( 'fl_col_number', 'fl_col_header', 'fl_cross_field_name', 'fl_cross_position', 'fl_replace_list' )
步骤2:在__init__中动态赋值choices
拿到pk、调用方法拿到headers之后,手动给对应字段的choices赋值:
def __init__(self, *args, **kwargs): pk = kwargs.pop('pk', 'Rien') super(MappingForm, self).__init__(*args, **kwargs) self.helper = FormHelper(self) self.fields['fl_replace_list'].widget.attrs[ 'placeholder'] = "Liste de tuples eg. : [('reman','ES'), ('Gasoline','Diesel')] " headers = GetCsvHeadersAndSamples(pk)['headers'] # 新增这行,按你需要的格式构造choices元组即可 self.fields['fl_col_header'].choices = [(header, header) for header in headers]
步骤3:POST请求实例化表单时也要传pk
如果你有处理表单提交的逻辑,实例化表单的时候除了传入request.POST,也要同步传入pk参数,否则提交时表单实例化还是会拿到默认值:
# views.py 补充完整逻辑 def create_mapping_form(request, pk): if request.method == "POST": # 提交时也要传pk form = MappingForm(request.POST, pk=pk) if form.is_valid(): form.save() # 后续业务逻辑自行补充 else: form = MappingForm(pk=pk) context = { 'form': form } return render(request, 'flows/partials/mapping_form.html', context)
内容的提问来源于stack exchange,提问作者Abpostman1
相关产品推荐
相关产品推荐

