嗨Stackoverflow人,
我正在尝试在Django中编写自己的联系表单,用户可以在其中写信给我,邮件将通过电子邮件发送并保存在数据库中以供跟踪。
但不知何故,model.save()不会保存任何东西。当我使用Admin检查条目时,Contact表为空。我也没有收到任何错误消息。
邮件的发送尚未完全实现。
为了测试代码,我在if / else分支中设置了一些状态消息,但是我没有得到任何语句 - 所以代码似乎被忽略了。但我不明白为什么?有什么建议吗?
我不确定是否正确地移交了views.py和forms.py之间的 request 变量。这可能是问题吗?
感谢您的建议。
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))
答案 0 :(得分:3)
我在这里看到两件事。在视图中,不调用该方法。该方法需要调用()。
然后save_and_email方法需要一些更正。首先需要自我论证,或将其转换为。 我的建议如下。
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))