我有一个显示模型表单的 cbv 创建视图。
我想预先选择一个外键字段,该字段显示为选择选择字段。
我的问题是模型形式中的 kwargs.get('building_id') 返回 None
class VlanCreateForm(ModelForm):
class Meta:
model = Vlan
fields = ['number','description','network','building']
def __init__(self, *args, **kwargs):
building_id = kwargs.get('building_id')
super().__init__(*args, **kwargs)
self.fields['building'].initial = building_id
building 是建筑物的外键。如果我放一个像 self.fields['building'].initial = 1 这样的常量,它就可以工作
class VlanCreateView(CreateView):
model = Vlan
form_class = VlanCreateForm
网址是
vlan/building/<int:building_id>/create
所以我称之为
vlan/building/1/create
答案 0 :(得分:0)
您需要在 get_form_kwargs
中定义building id
class VlanCreateView(CreateView):
...
building_id=None
def dispatch(self, request, *args, **kwargs):
# Retrieves the building id from url
self.building_id=kwargs.get("building_id")
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self, *args, **kwargs):
kwargs=super().get_form_kwargs(*args, **kwargs)
## Sends building id to the form
kwargs["building_id"]=self.building_id
return kwargs
答案 1 :(得分:0)
class VlanCreateForm(ModelForm):
class Meta:
model = Vlan
fields = ['number','description','network','building']
def __init__(self, *args, **kwargs):
self.building_id = kwargs.get('building_id')
super().__init__(*args, **kwargs)
self.fields['building'].initial = self.building_id
def post_url(self):
return reverse('app_name:url_name',kwargs={'cg_id':self.building_id} )
在表单发布操作中使用此 post_url 提交表单。 然后你在你的视图中得到了 building_id kwargs