使用 cbv 中的 url 参数初始化模型表单字段

时间:2020-12-29 20:28:53

标签: django django-forms

我有一个显示模型表单的 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

2 个答案:

答案 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