As_crispy_field передано недопустимое или несуществующее поле

я получаю эту ошибку as_crispy_field got passed an invalid or inexistent field каждый раз, когда я пытаюсь использовать as_crispy_field с формами вот мой код

models.py

class Customer_Email(models.Model):
    subject=models.CharField(max_length=50,null=True,blank=True)
    message=models.TextField(max_length=1000,null=True,blank=True)
    file_upload=models.FileField(null=True,blank=True)
    sender=models.ForeignKey(User,on_delete=models.CASCADE ,null=True,blank=True)
    company=models.ForeignKey(Customer,on_delete=models.CASCADE ,null=True,blank=True)
    date=models.DateTimeField(auto_now=True)

views.py

def send_email(request,id):
    customer=get_object_or_404(Customer,pk=id)
    form=Customer_Email_Form(request.POST)
    customers=Customer.objects.all()
    context={"customer":customer,"email_form":form,"customers":customers}
    if request.method == 'GET':
        return render(request,'crm/email_form.html',context)
    if request.method=='POST':
        if form.is_valid():
            form.save()
            messages.success(request,"Email Sent")
            return render(request,'crm/listing.html',context)
    return render(request,'crm/email_form.html',context)

html

{% load crispy_forms_tags %}
<form class="" method="POST">
    {% csrf_token %}
    <div class="form-group m-2">
        <label>Subject</label>
        {{email_form.subject|as_crispy_field}}
    </div>
    <div class="form-group m-2">
        <label>Message</label>
        {{email_form.message|as_crispy_field}}
    </div>
    <div class="form-group m-2">
        <label>Uplaod</label>
        {{email_form.file_upload|as_crispy_field}}
        <span class="color-secondary">you can attach 2M files (pdf,doc)</span>
    </div>
    
    {{email_form.company|as_crispy_field}}
    {{email_form.sender|as_crispy_field}}
    <button 
    class="btn btn-primary btn-lg mt-5"
    type="submit"
    hx-post="email_form/p={{customer.id}}"
    hx-target="#crm-list"
    data-dismiss="modal"
    >Send Email <i class='bx bx-mail-send bx-xl'></i></button>
</form>

forms.py

class Customer_Email_Form(forms.ModelForm):
    class Meta:
        model=Customer_Email
        fields=['subject','file_upload','message','sender','company']

я пытался изменить его на forms.Form, но он дает мне ту же ошибку я не знаю, что именно я должен сделать и я новичок в этом

Попробуйте это...

def send_email(request,id):
    customer=get_object_or_404(Customer,pk=id)
    form=Customer_Email_Form()
    customers=Customer.objects.all()
    context={"customer":customer,"email_form":form,"customers":customers}
    if request.method == 'GET':
        return render(request,'crm/email_form.html',context)
    if request.method=='POST':
        form=Customer_Email_Form(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request,"Email Sent")
            return render(request,'crm/listing.html',context)
    return render(request,'crm/email_form.html',context)

Вы передавали POST-данные в форму до того, как они были отправлены, а затем отображали форму. Я считаю, что проще/понятнее перестроить форму следующим образом:

def send_email(request,id):
    if request.method=='POST':
        form=Customer_Email_Form(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request,"Email Sent")
            return redirect('send_email', id)
        else: 
            messages.error(request, form.errors)
            return redirect('send_email', id)
    
    else:
        customer=get_object_or_404(Customer,pk=id)
        form=Customer_Email_Form()
        customers=Customer.objects.all()
        context={"customer":customer,"email_form":form,"customers":customers}
        return render(request,'crm/email_form.html',context)

Предположим, что вы импортировали redirect и ваше имя url в urls.py будет 'send_email'.

Вернуться на верх