Django: model.save () не сохраняется, но нет сообщения об ошибке - PullRequest
1 голос
/ 05 ноября 2011

Привет Stackoverflow люди,

Я пытаюсь написать свою собственную контактную форму в Django, где пользователи могут писать мне сообщения, и сообщение будет отправлено по электронной почте и сохранено в БД для отслеживания.

Но почему-то модель.save () ничего не сохранит. Когда я проверяю записи с помощью Admin, таблица контактов пуста. Я также не получаю никаких сообщений об ошибках.

Отправка сообщения еще не полностью осуществлена.

Чтобы проверить код, я настроил некоторые сообщения о состоянии в ветке if / else, но я не получил ни одного из утверждений - поэтому код , похоже, игнорируется. Но я не понимаю, почему? Есть предложения?

Я не уверен, правильно ли я передал переменную request между views.py и forms.py. Может ли это быть проблемой?

Спасибо за ваши предложения.

models.py

from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.mail import send_mail

import datetime, random

class Contact(models.Model):
"""
Contact class is the model for user messages. 
Every message will be sent.
"""
CATEGORIES = (
        ('Suggestion', 'I have a suggestion'),
        ('Feedback', 'General feedback'),
        ('Complaint', 'You should improve ...'),
        # ('', ''),
        )

category = models.CharField(_('Message Category'),
                            max_length=10, 
                            choices=CATEGORIES)

subject = models.CharField(_('Message Subject'), 
                            max_length=255,)

sender = models.EmailField(_('Email Address'),)

message = models.TextField(_('Message Box'),)

# date and ansbwered are not visible to the user
timeOfMessage = models.DateTimeField(_('Time of sending'), blank=True, null=True)

answered = models.BooleanField(_('Answered?'),
                               default=False,)

def __unicode__(self):
    return '%s' % self.sender

def send_and_save(self):

    subject_new = ':'.join(self.category, self.subject)

    send_mail(subject_new,
              message,
              sender, 
              'info@future_domain_address.com')
    return True

forms.py

from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _
from contact.models import Contact
import datetime

class ContactForm(ModelForm):
    class Meta:
        model = Contact
        exclude = ('answered', 'timeOfMessage')

    def save_and_email(request):
       if request.method == 'POST':
           form = self(request.POST)
           if form.is_valid():
            # contact.cleaned_data()
              contact = form.save(commit=False)
              contact.timeOfMessage = datetime.now()
              contact.answered = False
              contact.save()
              print "was here"
              return True
           else: 
              print "Saving Failed"
       else:
           print "POST failed"
       return False

views.py

from django.views.generic.simple import direct_to_template
from django.shortcuts import redirect, get_object_or_404, render_to_response
from django.utils.translation import ugettext as _
from django.http import HttpResponseForbidden, Http404, HttpResponseRedirect, HttpResponse
from django.template import RequestContext
from django.core.mail import BadHeaderError
from contact.forms import ContactForm 

def contact(request):
   if request.method == 'POST':
       try:
           contactform = ContactForm()
           contactform.save_and_email
       except BadHeaderError:
           return HttpResponse(_('Invalid header found.'))
       return HttpResponseRedirect('/contact/thankyou/')

   return render_to_response('contact/contact.html', {'form': ContactForm()},
        RequestContext(request))

1 Ответ

3 голосов
/ 05 ноября 2011

Я вижу две вещи здесь.На вид метод не вызывается.Метод должен вызываться ().

Затем метод save_and_email нуждается в некоторых исправлениях.Прежде всего, необходимо аргумент self или преобразовать его в a.Мое предложение заключается в следующем.

def save_and_email(self):
    if self.is_valid():
       contact = self.save(commit=False)
       contact.timeOfMessage = datetime.now()
       contact.answered = False
       contact.save()
       return True
    else: 
       return False

И мнение:

def contact(request):
   if request.method == 'POST':
           contactform = ContactForm(request.POST)
           if contactform.save_and_email():
              return HttpResponseRedirect('/contact/thankyou/')

   return render_to_response('contact/contact.html', {'form': ContactForm()},
        RequestContext(request))
...