在cbv中使用url参数初始化modelform字段



我有一个cbv创建视图,它显示了一个模型窗体。我想预选一个外键字段,该字段显示为选择选项字段
我的问题是modelform中的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

建筑是建筑的外来钥匙。如果我把一个常数像self.fields['building'].initical=1,它就是工作

class VlanCreateView(CreateView):
model = Vlan
form_class = VlanCreateForm

url是

vlan/building/<int:building_id>/create

所以我把它叫做

vlan/building/1/create

您需要在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
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提交表单。然后你在你的视图kwargs 中得到了building_id

最新更新