2013-12-24 3 views
0

Я работаю с формами Django и по какой-то причине эта форма не будет проверяться! Он подчиняется в порядке, или, по крайней мере, на сервере запускается ответ HTTP-ответа с кодом 200 (ok). По какой-то причине моя форма не пройдет тест is_valid!Форма Django не подтвердит

views.py:

def new_show(request): 
if request.method == 'POST': 
    img_form = ImageForm(request.POST, request.FILES) 
show_form = NewShowForm(request.POST) 
if show_form.is_valid(): 
    new_Show = Show() 
    new_Show.title=show_form.cleaned_data['title'] 
    new_Show.body=show_form.cleaned_data['body'] 
    new_Show.pub_date=timezone.now() 
    new_Show.location=show_form.cleaned_data['location'] 
    new_Show.time=show_form.cleaned_data['time'] 
    new_Show.save()  
    if img_form.is_valid(): 
     image=Image(image=request.FILES['imageFile']) 
     new_Show.image_set.add(image) 
     return HttpResponseRedirect(reverse('shows')) 

    else: 
     return HttpResponseRedirect(reverse('shows')) 
else: 
    show_form = NewShowForm() 
    img_form = ImageForm() 
return render_to_response(
    'shows/new_show.html', 
    {'show_form': show_form, 'img_form': img_form}, 
    context_instance=RequestContext(request) 
    ) 

Вот мой шаблон фрагмент:

<form action="{% url "new_show" %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    <p>{{ show_form.non_field_errors }}</p> 
    <p> 
     <label for="title">Title:</label> 
     <input type="text" name="title"/> 
    </p> 
    <p> 
     <label for="body">Body:</label> 
     <textarea type="text" name="body"> </textarea> 
    </p> 

    <p> 
     <label for="location">Location:</label> 
     <input type="text" name="location"/> 
    </p> 
    <p> 
     <label for="time">Date:</label> 
     <input type="text" id="time" maxlength="25" size="25" name="time"><a href="javascript:NewCal('time','ddmmmyyyy',true,24)"><img src="{{ STATIC_URL }}../../static/cal.gif" width="16" height="16" border="0" alt="Pick a date"></a> 

    </p> 



<!-- Upload Form. Note enctype attribute! --> 


    {% csrf_token %} 
    <p>{{ img_form.non_field_errors }}</p> 
    <p>{{ img_form.imageFile.label_tag }}</p> 
    <p> 
     {{ img_form.imageFile.errors }} 
     {{ img_form.imageFile }} 
    </p> 

<p><input type="submit" value="Add Upcoming Show"></input></p> 
</form> 

Вот моя форма Класс:

class NewShowForm(forms.Form): 
    title=forms.CharField() 
    body=forms.CharField(widget=forms.TextArea) 
    location=forms.CharField() 
    time=forms.DateTimeField(required=True) 
class ImageForm(forms.Form): 
    imageFile = forms.FileField(required=False, label='Select an Image') 

Пожалуйста, помогите мне!

+1

Пожалуйста, а) попытайтесь исправить ваш отступ и b) покажите свои объявления класса формы. –

+0

ok Я думаю, что я получил отступы правильно. Я добавил forms.py –

+0

Основываясь на простом просмотре кода формы, на меня бросаются две вещи. Во-первых, по умолчанию требуются поля - у вас есть 'required = True', указанный для' time', но это необязательно. Если вы отправляете без значений для 'title',' body' или 'location', форма недействительна. Если это не проблема, я бы проверил, какие значения передаются для ввода 'time'. Вы объявили его как «DateTimeField», и если ваш виджет Javascript не создает строку, которую поле может анализировать, это неверно. Вы видите сообщения об ошибках формы после отправки? –

ответ

-1

Поскольку вы добавили две формы Django под одним тегом HTML-формы, при отправке формы на переднем конце вы отправляете дополнительное поле через request.POST, которого нет у вашего NewShowForm. Если вы объедините обе формы в одну форму Django, вы сможете заставить ее работать.

+0

Это имеет значение только в том случае, если в файлах было указано имя поля. Форматы Django вытягивают значения из 'POST' dict на основе их имен полей и игнорируют все, для чего у них нет поля. –

+0

Кроме того, если бы это была проблема, было бы лучше решить ее с использованием аргумента формы 'prefix', а не для объединения двух классов. –

1

Если модель new_Show является моделью, почему бы не создать ModelForm вместо forms.Form?

Таким образом, вместо

class NewShowForm(forms.Form): 
    title=forms.CharField() 
    body=forms.CharField(widget=forms.TextArea) 
    location=forms.CharField() 
    time=forms.DateTimeField(required=True) 
class ImageForm(forms.Form): 
    imageFile = forms.FileField(required=False, label='Select an Image') 

почему не используется,

from django.forms import ModelForm 
class NewShowForm(ModelForm): 
    class Meta: 
     model = NewShow 

class ImageForm(ModelForm): 
    class Meta: 
     model = Image 

?

Использование ModelForm гарантирует, что проверка формы соответствует модели. Более того, он может отрезать ваш код (особенно строки с 6 по 11).

0

Это поможет добавить эти две строки в ваш взгляд, прежде чем если is_valid(), чтобы увидеть ошибки это дает:

if request.method == 'POST': 
    img_form = ImageForm(request.POST, request.FILES) 
    show_form = NewShowForm(request.POST) 

    print(form.is_valid()) 
    print(form.errors) 

    if show_form.is_valid(): 

Вы можете вставить ошибки здесь, и мы можем увидеть, что проблема

Смежные вопросы