django中ModelForm解決多表單組合顯示問題

1、多表單組合顯示問題

在項目中用ModelForm生成頁面時html

當有多表單組合顯示時,會顯示所有的關聯表單數據。post

 

而在實際項目中可能會出現只想讓用戶選擇部分數據,這時候這樣的顯示就有問題。ui

2、問題解決方案

views.pyspa

實例化Form對象時注意把當前登陸用戶對象傳到Form中code

class Add_Edit_ConsultRecord(View): def get(self, request, edit_id=None): if edit_id is None: # 新增get,# 實例化一個包含當前銷售的跟進記錄
            consult_obj = ConsultRecord(consultant=request.user) else: # 編輯get,
            consult_obj = ConsultRecord.objects.filter(pk=edit_id).first() form_obj = ConsultRecordForm(instance=consult_obj) return render(request, "consultrecord_change.html", {'form_obj': form_obj, 'edit_id': edit_id}) def post(self, request, edit_id=None): if edit_id is None: # 新增post,# 實例化一個包含當前銷售的跟進記錄
            consult_obj = ConsultRecord(consultant=request.user) else: # 編輯post,
            consult_obj = ConsultRecord.objects.filter(pk=edit_id).first() form_obj = ConsultRecordForm(request.POST, instance=consult_obj) if form_obj.is_valid(): # 經過數據校驗
 form_obj.save() return redirect(reverse("consult_records", args=('0')))

 

相比較BaseForm,BaseModelForm多了instance參數,它等價於Model模型的一個實例
ModelForm中傳遞了initial也同樣能夠生效,同時還會設置到Model中

 form.pyorm

class BootForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)  
        for field in self.fields.values(): field.widget.attrs.update({'class': 'form-control'}) field.error_messages = {"required": "該字段不能爲空"}
# 跟進記錄Form
class ConsultRecordForm(BootForm): class Meta: model = ConsultRecord fields = "__all__"

    def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 清除delete_status字段的樣式
        self.fields['delete_status'].widget.attrs.pop('class') # 當前登陸的用戶(銷售)對象
        # print(self.instance.consultant)
        # self.fields['customer'].choices = [('', '---------'), (2, '239966930011'),]
        """ 相比較BaseForm,BaseModelForm多了instance參數,它等價於Model模型的一個實例 ModelForm中傳遞了initial也同樣能夠生效,同時還會設置到Model中 # self.instance.consultant.customers.all() 先獲得當前登陸對象,再經過銷售對象反向查詢客戶對象 經過列表生成式生成choices結構[('', '---------'),(1,'2399669300'), (2, '239966930011'),] """
        # 限制添加和編輯時多選框顯示的所諮詢客戶只能是本身跟進的,
        customer_choices = [(i.pk, str(i)) for i in self.instance.consultant.customers.all()] customer_choices.insert(0, ('', '---------'))# insert 列表插入數據,默認選擇框
        # 將本來的客戶對像替換掉
        self.fields['customer'].choices = customer_choices # 限制添加和編輯時多選框顯示的跟進人只能是當前登陸人,
        # print(list(self.fields['customer'].widget.choices))
        self.fields['consultant'].choices = [(self.instance.consultant.pk, self.instance.consultant.username)]
相關文章
相關標籤/搜索