Django 1.11如何将Kwarg传递给ModelForm字段?
解决URL参数传递到ModelForm字段的问题
我来帮你搞定这个问题!要把URL里的munc参数传到ModelForm的字段里,其实只需要两步:在视图层把参数传递给表单,然后在表单里接收并使用它就行。
第一步:在CreateView中传递URL参数到表单
你需要重写TentCreate视图的get_form_kwargs方法,这个方法负责生成传给表单的参数。我们把URL捕获到的munc参数加到kwargs里:
class TentCreate(CreateView): model = Tent form_class = TentForm def get_form_kwargs(self): # 先获取父类生成的默认kwargs kwargs = super().get_form_kwargs() # 把URL里的munc参数加入到kwargs中,键名要和URL配置里的(?P<munc>\d+)一致 kwargs['munc'] = self.kwargs.get('munc') return kwargs
第二步:在ModelForm中接收参数并修改字段
接下来修改你的TentForm,在__init__方法里先取出这个自定义的munc参数(记得用pop避免传给父类的构造函数,不然会报错),然后用它来设置primary字段的queryset:
class TentForm(ModelForm): class Meta: model = Tent exclude = ('asfo','niho') def __init__(self, *args, **kwargs): # 取出munc参数,给个默认值None防止没有传参时出错 munc = kwargs.pop('munc', None) # 调用父类的构造函数 super(TentForm, self).__init__(*args, **kwargs) # 如果拿到了munc参数,就用它过滤primary字段的queryset if munc is not None: # 这里替换成你实际的过滤逻辑,比如假设你的Primary模型有munc外键 self.fields['primary'].queryset = Primary.objects.filter(munc_id=munc)
注意事项
- 确保URL配置里的参数名(
(?P<munc>\d+))和视图、表单里用的键名完全一致,都是munc - 过滤queryset的逻辑要根据你实际的模型关系调整,比如如果
primary和munc是多对多或者其他关联,要对应修改过滤条件 - 用
kwargs.pop('munc', None)而不是直接取值,是因为ModelForm的父类构造函数不认识这个自定义参数,直接传会抛出异常
内容的提问来源于stack exchange,提问作者cr1
相关产品推荐
相关产品推荐

