django中ModelForm解决多表单组合显示问题

一、多表单组合显示问题

在项目中用ModelForm生成页面时

当有多表单组合显示时,会显示全部的关联表单数据。

 

而在实际项目中可能会出现只想让用户选择部分数据,这时候这样的显示就有问题。

二、问题解决方案

views.py

实例化Form对象时注意把当前登录用户对象传到Form中

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.py

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)]

 

 

  

转载于:https://www.cnblogs.com/zwq-/p/10151213.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django ModelForm ,你可以使用 `forms.ClearableFileInput` 来生成一个文件上传表单。如果你想要在表单显示原有图片并且允许用户删除它,可以使用以下步骤: 1. 在 `forms.py` 文件创建一个类似下面的 `ModelForm`: ```python from django import forms from .models import YourModel class YourModelForm(forms.ModelForm): class Meta: model = YourModel fields = ('field1', 'field2', 'image_field') widgets = { 'image_field': forms.ClearableFileInput(attrs={'id': 'image-preview'}) } ``` 2. 在模板使用 JavaScript 和 CSS 实现预览图片的功能。以下是一个示例代码: ```html {% extends "base.html" %} {% block content %} <form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <img id="image-preview" src="{{ object.image_field.url }}" alt="Preview Image"> <button type="submit">Save</button> </form> {% endblock %} {% block javascript %} <script> // Show preview of the image function readURL(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $('#image-preview').attr('src', e.target.result); }; reader.readAsDataURL(input.files[0]); } } $('#id_image_field').change(function () { readURL(this); }); </script> {% endblock %} ``` 在这个示例,我们使用 `forms.ClearableFileInput` 生成了一个文件上传表单,并指定了 `id` 为 `image-preview`。在模板,我们使用 `<img>` 标签来显示原有图片并在用户上传新图片时刷新预览。我们还在模板的底部插入了一个 JavaScript 代码块,用于实现预览图片功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值