2015-02-09 2 views
1

Я хотел создать контактную форму Django на веб-сайте, и я нашел, что Django хрустящие формы очень полезны для этого, но оказалось, что я не могу смешивать его с Django FormView так же, как это. Хрустящие формы сделали потрясающую работу в интерфейсной макете, но я не могу захватить любую информацию из заполненной формы в мое приложение Django. Я пробовал этот учебник: Simple Django email form using CBV, но он устарел и совсем не помогает. Вот мой forms.py:Смешанные формы Django с FormView

from django import forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Submit 

class ContactForm(forms.Form): 

    name = forms.CharField(
     label = "Name:", 
     max_length = 80, 
     required = True, 
    ) 

    email = forms.CharField(
     label = "E-mail:", 
     max_length = 80, 
     required = True, 
    ) 

    subject = forms.CharField(
     label = "Subject:", 
     max_length = 80, 
     required = True, 
    ) 

    message = forms.CharField(
     widget = forms.Textarea, 
     label = "Message:", 
     required = True, 
    ) 

    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.add_input(Submit('send', 'Send')) 

views.py:

from django.shortcuts import render 
from myapp.forms import ContactForm 

from django.core.mail import send_mail 
from django.views.generic.edit import FormView 

class ContactFormView(FormView): 

    form_class = ContactForm 
    template_name = "myapp/contact.html" 
    success_url = '/email_sent/' 

    def form_valid(self, form): 
     message = "{name}/{email} said: ".format(
      name=form.cleaned_data.get('name'), 
      email=form.cleaned_data.get('email')) 
     message += "\n\n{0}".format(form.cleaned_data.get('message')) 
     send_mail(
      subject=form.cleaned_data.get('subject').strip(), 
      message=message, 
      from_email='[email protected]', 
      recipient_list=['[email protected]'], 
     ) 
     return super(ContactFormView, self).form_valid(form) 

def contact(request): 
    contact_form = ContactFormView() 
    return render(request, 'myapp/contact.html', {'contact_form': contact_form}) 

и мой шаблон contact.html:

{% extends "layout.html" %} 
{% load crispy_forms_tags %} 

{% block title %}Contact{% endblock %} 

{% block content %} 
    <h2><b>Contact</b></h2> 
    <div class="container"> 
     <p>You can e-mail me at: <a href="mailto:[email protected]">[email protected]</a></p> 
     <br> 
     <p>Or simply fill the form below:</p> 
     <br> 
     {% crispy contact_form %} 
    </div> 
{% endblock %} 

Что я получаю:

Exception Type: TypeErrorException Value: 
'ContactFormView' object is not iterable 

Любые предложения по использованию хард-форм Django с Django F ormView?

+0

Я не знаю джанго хрустящих форм, но почему вы не можете использовать de неисправности? Они, кажется, делают то, что вы пытаетесь сделать. – Paco

+0

Я не пробовал формы django default, если честно. Crispy просты в реализации, и они используют bootstrap3, как и на моем сайте: D – Nhor

+0

Вы можете адаптировать формы django для использования классов bootstrap 3 путем создания тега шаблона для добавления класса css в ваши шаблоны (это то, что я делаю) или изменить атрибуты для css непосредственно в классе формы. Но опять же, я никогда не использовал хрустящие формы, поэтому я не знаю, хороши они или нет. – Paco

ответ

2

Это не имеет ничего общего с хрустящими формами. Проблема заключается в этом фрагменте кода, где вы обрабатываете ContactFormView, как если бы это была форма.

def contact(request): 
    contact_form = ContactFormView() 
    return render(request, 'myapp/contact.html', {'contact_form': contact_form}) 

Однако ContactFormView не является формой, это основано вид класса. Вам не нужно определять другой вид contact, у вас уже есть вид ContactFormView.

Измените шаблон URL-адрес для использования на основе представления класса:

url(r'^contact/$', ContactFormView.as_view(), name='contact') 

Затем в шаблоне, включает в себя форму с:

{{ form }}} 

После того, как вид работает с регулярными формами, используйте хрустящий ярлык так, чтобы он был оформлен по вашему желанию:

{% crispy form %} 
+0

Вот и все, я не понял. Благодаря! – Nhor