在項目中用ModelForm生成頁面時html
當有多表單組合顯示時,會顯示所有的關聯表單數據。post
而在實際項目中可能會出現只想讓用戶選擇部分數據,這時候這樣的顯示就有問題。ui
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)]