Почему 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. Вот как отобразить его.