Django表单提交(我认为)但未保存到数据库
下面是我写的代码,我认为这应该是一个可以正常工作的电子邮件提交表单,放在一个bootstrap3的模态框里。当我提交表单后,我会被带到一个简单的感谢页面,但我觉得电子邮件地址并没有被发送到数据库,因为在Django的管理后台看不到。
另外,我觉得这个功能有问题的另一个原因是,表单的验证似乎没有正常工作。我可以提交一些根本不像电子邮件地址的内容,但我仍然会被送到感谢页面。
我所有的文件都有问题吗,还是说只是某个特定的地方出了问题?
views.py
from django.shortcuts import render
from temp.models import Email
from forms import EmailForm
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = EmailForm()
email.save()
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
def thanks(request):
return render(request, 'temp/thanks.html')
forms.py
from django import forms
class EmailForm(forms.Form):
email = forms.CharField(max_length=100)
models.py
from django.db import models
class Email(models.Model):
email = models.CharField(max_length=200)
def __unicode__(self): # Python 3: def __str__(self):
return self.email
index.html
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Sign up for the Beta</h4>
</div>
<div class="modal-body">
<!-- The async form to send and replace the modals content with its response -->
<form class="form-horizontal well" data-async data-target="#myModal" action="thanks/" method="POST">
{% csrf_token %}
<fieldset>
<div>Your email address:
<span>
<input type="text" id="modalInput"></input>
</span>
</div>
</fieldset>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</div>
</div>
<!-- End Modal -->
5 个回答
我觉得你的表单没有变成有效的状态,所以它没有被提交。你可以试着把你的模板写成这样:
<form action="thanks/" method="post">
{% csrf_token %}
<div>Your email address:
{{ form.as_p }} </div> <!-- just for testing -->
<input type="submit" value="Submit" />
</form>
然后在表单里:
class EmailForm(forms.Form):
email = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'id': 'myModel'})) #Seems, here you want your email's input field id to myModel
在视图里:
if form.is_valid():
emaildata=Email() #Model email instance
emaildata.email= form.cleaned_data['email']
emaildata.save()
# or try saveing like zaphod suggested
编辑
如果你想继续使用你的模板,我建议你放弃使用表单。在视图中,你可以通过 request.body
来获取数据。(我觉得你是在用ajax来保存数据)比如说:
def index(request):
if request.POST:
data= request.body
emaildata = Email() #Model Email instance
emaildata.email= str(data)
emaildata.save()
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
你有三个错误。首先,你应该在索引视图中把EmailForm传递给index.html。其次,现在在索引视图中的内容(根据之前的回答进行了修正)应该移到感谢视图中,以便获取用户在EmailForm中输入的信息。最后,你还需要修正你的模板,以确保包含传递过来的EmailForm。
你现在保存的是一个空的表单,而不是从请求中获取的数据。使用ModelForm会更简单,只需要保存表单就可以了。而且用EmailField代替CharField会更好,这样可以更有效地验证电子邮件地址的格式。
forms.py
from django.forms import ModelForm
from temp.models import Email
class EmailForm(forms.ModelForm):
class Meta:
model = Email
views.py
from django.shortcuts import render
from temp.models import Email
from temp.forms import EmailForm
def index(request):
if request.method == 'POST':
# POST, get the data from the form
form = EmailForm(request.POST)
if form.is_valid():
# if is valid, just save, and return a new page with thanks
form.save()
return render(request, 'temp/thanks.html')
else:
# Form has errors, re-render with data and error messages
return render(request, 'temp/index.html', {'form': form,})
else:
# GET, render new empty form
form = EmailForm()
return render(request, 'temp/index.html', {'form': form,})
在下面的代码中,你好像是用一个空的表单重新初始化了电子邮件。而且你也没有创建或访问一个电子邮件模型的实例来保存这个电子邮件。
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = EmailForm() <<< reinitializing with empty form
email.save()
return render(request, 'temp/thanks.html')
你可能想要做的是:
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email_data = form.cleaned_data['email'] # read form data
email = Email.objects.create(email=email_data) # create model instance
email.save() # save instance
return render(request, 'temp/thanks.html')
如果你使用模型表单(ModelForms)而不是普通表单(Form),你可以直接用form.save()来保存模型。
把你的视图更新成下面这样
def index(request):
if request.POST:
form = EmailForm(request.POST)
if form.is_valid():
email = form.save() #use form to save it in DB
return render(request, 'temp/thanks.html')
return render(request, 'temp/index.html')
另外,使用 models.EmailField()
来替代 CharField()
来处理 email
。这样用 EmailField
的话,Django 会自动检查数据是否正确。把你的表单设置成 ModelForm
,这样 Django 就能把数据保存到对应的模型/表格里。
class EmailForm(forms.ModelForm):
class Meta:
model = Email