Почему form.is_valid() всегда ложно?

Я пытался создать форму contact us в django, но я получаю всегда false, когда я хочу использовать функцию .is_valid().

вот моя форма:

from django import forms
from django.core import validators


class ContactForm(forms.Form):
    first_name = forms.CharField(
        widget=forms.TextInput(
            attrs={'placeholder': 'نام خود را وارد کنید'}),
        label="نام ",
        validators=[
            validators.MaxLengthValidator(100, "نام شما نمیتواند بیش از 100 کاراکتر باشد")])

    last_name = forms.CharField(
        widget=forms.TextInput(
            attrs={'placeholder': 'نام خانوادگی خود را وارد کنید'}),
        label="نام خانوادگی",
        validators=[
            validators.MaxLengthValidator(100, "نام خانوادگی شما نمیتواند بیش از 100 کاراکتر باشد")])

    email = forms.EmailField(
        widget=forms.EmailInput(
            attrs={'placeholder': 'ایمیل خود را وارد کنید'}),
        label="ایمیل",
        validators=[
            validators.MaxLengthValidator(200, "تعداد کاراکترهایایمیل شما نمیتواند بیش از ۲۰۰ کاراکتر باشد.")
        ])

    title = forms.CharField(
        widget=forms.TextInput(
            attrs={'placeholder': 'عنوان پیام خود را وارد کنید'}),
        label="عنوان",
        validators=[
            validators.MaxLengthValidator(250, "تعداد کاراکترهای  شما نمیتواند بیش از 250 کاراکتر باشد.")
        ])

    text = forms.CharField(
        widget=forms.Textarea(
            attrs={'placeholder': 'متن پیام خود را وارد کنید'}),
        label="متن پیام",
    )

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__()
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form_field require'

вот мое мнение:

from django.shortcuts import render

from .forms import ContactForm
from .models import ContactUs


def contact_us(request):
    contact_form = ContactForm(request.POST or None)
    if contact_form.is_valid():
        first_name = contact_form.cleaned_data.get('first_name')
        last_name = contact_form.cleaned_data.get('last_name')
        email = contact_form.cleaned_data.get('email')
        title = contact_form.cleaned_data.get('title')
        text = contact_form.cleaned_data.get('text')

        ContactUs.objects.create(first_name=first_name, last_name=last_name, email=email, title=title, text=text)
        # todo: show user success message

        contact_form = ContactForm()
    context = {
        'form': contact_form
    }

    return render(request, 'contact_us/contact_us.html', context)

вы можете использовать CBVs, чтобы легко сохранить данные на форме valid

views.py

from django.views import generic

class ContactCreateView(generic.CreateView,):
    model = Contact
    fields = "__all__"   
    success_url = reverse_lazy(url_name)

в ваших шаблонах

templates/contact_form.html

.

<form action="{% url 'contact' %}" id="contactform" method="post">
    {% csrf_token %}
  {% for formfield in form %}
   <div class="col-md-6 col-lg-6">
       <div class="form_block">
           {{ formfield}}
           {% for error in formfield.errors %}
               <p class="text-danger">{{ error }}</p>
           {% endfor %}
       </div>
     </div>
#add submit button here

urls.py только не забудьте добавить as_view() при вызове вашего представления в url

    path("", views.ContactCreateView.as_view(), name="contact"),

или используя FBV, вы можете попробовать:

def contact_us(request):
    contact_form = ContactForm(request.POST or None)
    if contact_form.is_valid():
        contact_form.save()
       
        
    context = {
        'form': contact_form
    }

    return render(request, 'contact_us/contact_us.html', context)


Удалите эти строки из вашего файла forms.py:

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__()
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form_field require'

Исправьте свое представление на основе документации:

def contact_us(request):
    if request.method == 'POST':
        contact_form = ContactForm(request.POST)
        if contact_form.is_valid():
            ContactUs.objects.create(**contact_form.cleaned_data)
            messages.success(request, 'My success message')
            # you want to send to your home
            return redirect('/contact')

    else:
        contact_form = ContactForm()
    context = {
        'form': contact_form
    }

    return render(request, 'contact_us.html', context)

Я взял на себя смелость очистить ваше представление, используя **kwargs, поскольку у вас много полей. Использовал Django messages для отображения успешного сообщения при создании obj. Вот как отобразить его.

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