Django中用UpdateView编辑时如何加载带复选框的数据表格?
解决方案
1. 更新CampaignEditor类,传递必要数据到模板
重写get_context_data方法,把邮件列表和当前Campaign已关联的邮件ID注入模板上下文:
class CampaignEditor(UpdateView): model = Campaigns template_name = 'mailsinfo/add_campaign.html' form_class = CampaignsForm def get_context_data(self, **kwargs): # 获取默认上下文 context = super().get_context_data(**kwargs) # 加载所有邮件数据,和新增功能保持一致 email_data = list(Emails.objects.values()) context['data'] = MailsTableWithoutPass(email_data) # 获取当前Campaign已选中的邮件ID列表 current_campaign = self.get_object() selected_ids = list( CampaignEmail.objects.filter(campaigne_guid=current_campaign.pk) .values_list('email_guid', flat=True) ) context['selected_email_ids'] = selected_ids return context
2. 修改模板,初始化表格并勾选已选中的行
在表格初始化的JS代码中,添加勾选逻辑:
<script> var $table = $('#table') $(function() { var data = {{data|safe}} // 获取已选中的邮件ID var selectedIds = {{selected_email_ids|safe}}; // 初始化表格 $table.bootstrapTable({data: data}) // 根据ID勾选对应的行 $table.bootstrapTable('checkBy', {field: 'id', values: selectedIds}); }) </script>
3. 处理编辑时的关联数据更新
重写CampaignEditor的form_valid方法,确保编辑时先清除旧关联,再新增新关联:
def form_valid(self, form): # 先保存Campaign表单数据 response = super().form_valid(form) current_campaign = self.object # 获取提交的选中邮件ID submitted_ids = self.request.POST.get('IDs', '') # 清除当前Campaign的所有旧关联邮件 CampaignEmail.objects.filter(campaigne_guid=current_campaign.pk).delete() # 添加新的关联邮件 if submitted_ids: ids_list = submitted_ids.split(',') for email_id in ids_list: CampaignEmail.objects.create( email_guid=int(email_id), campaigne_guid=current_campaign.pk ) return response
4. 移除冗余逻辑(可选)
编辑功能的保存逻辑已在form_valid中实现,无需再调用addCampaignDataToDB。新增功能可保留原函数,二者互不影响。
修改完成后,访问编辑URL时:
- 表单自动填充当前Campaign的数据
- 数据表格加载所有邮件
- 之前选中的邮件自动被勾选
- 保存时同步更新Campaign信息及关联的邮件记录
内容的提问来源于stack exchange,提问作者juniorDev
相关产品推荐
相关产品推荐

