django FormView не создает объект или не перенаправляет на success_url - PullRequest
0 голосов
/ 14 ноября 2018

пытается реализовать форму django с помощью FormView на основе классов, и следование документам у меня не работает (https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-editing/. Проект - 1.11.9

models.py

class Contact(models.Model):
    name = models.CharField(max_length=100)
    company = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    message = models.TextField()
    date_created = models.DateField(verbose_name="Created date", auto_now_add="True")

forms.py

from django import forms

from .models import Contact

class ContactForm(forms.ModelForm):

    class Meta:
        model = Contact
        labels = {
            'company': 'Company or Organization'
        }
        exclude = ('date_created',)

views.py

from django.shortcuts import render
from django.core.mail import send_mail
from django.views.generic import FormView, TemplateView

from .forms import ContactForm

class ContactFormView(FormView):

    form_class = ContactForm
    template_name = "contact.html"
    success_url = '/thanks/'

    def form_valid(self,form):
        message = "{name} from {company} / {email} said: ".format(
            name=form.cleaned_data.get('name'),
            company=form.cleaned_data.get('company'),
            email=form.cleaned_data.get('email'))
        message += "\n\n{0}".format(form.cleaned_data.get('message'))
        send_mail(
            subject='new message',
            message=message,
            from_email='foo@bar.com',
            recipient_list=['foo@blah.com',]
        ) 
        form.save()
        return super(ContactFormView, self).form_valid(form)

urls.py

from django.conf.urls import url
from django.views.generic import TemplateView

from . import views

from .views import ContactFormView


urlpatterns = [
    url(r'^contact/?$', ContactFormView.as_view(), name="contact"),
    url(r'^thanks/?$', views.thanks, name="thanks"),
    url(r'^.*$', RedirectView.as_view(url=reverse_lazy('index'), permanent=True), name='home')

]

contact.html

{% extends 'base.html' %}
{% load humanize %}

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

{% block content %}
<div class="wrapper">
  <div id="content" class="container push-half">
     <div class="col-lg-12">

         <h1>Contact</h1>

         <p class="push">Please use the form below to send us a message, and we'll get back to you as soon as we can.</p>
          <div class="push cf">
              <form action="." method="post" class="contact-form">
                      {% csrf_token %}
                      {{ form }}
                      <div class="clearfix"></div>
                      <input type="submit" value="Submit" id="contact-submit-btn" class="btn" />
              </form>
          </div>    
      </div>
  </div>
</div>
{% endblock %}

Во-первых, у меня есть 'thanks' представление, но success_url при отправке формы просто вызывает представление перенаправления обратно домой. Также пытался success_url = reverse_lazy('thanks'), но все еще перенаправляется обратно домой. Нужно ли явно перезаписать get_success_url для того, чтобы это работало? возможно связано, form.save() не создает новый Contact объект в дБ из полей формы. спасибо

1 Ответ

0 голосов
/ 14 ноября 2018

На URL /contact (без завершающего слеша) <form action="." ...> означает, что запрос будет отправлен на /.

Изменить действие, чтобы специально публиковать в представлении контактов:

<form action="{% url 'contact' %}" method="post" class="contact-form">

Обычно я бы посоветовал вам прекратить использовать косую черту по желанию и позволить Django перенаправить с /contact на /contact/. Однако это может не сработать из-за переадресации всех сообщений.

Тщательно продумайте, действительно ли вы хотите перенаправить все ловушки, это изменит тонкость поведения Django. Вы почти наверняка не хотите permanent=True для вашего перенаправления - если вы добавите другое представление в будущем, браузеры кэшируют перенаправление и продолжат перенаправлять на домашнюю страницу.

...