以下是我认为应该是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 -->
答案 0 :(得分:2)
将您的观点更新为
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()
使用email
代替CharField()
。使用EmailField
django将适当地验证数据。将表单设为ModelForm
,以便django将数据保存到适当的模型/表中。
class EmailForm(forms.ModelForm):
class Meta:
model = Email
答案 1 :(得分:2)
在下面的代码中,您似乎是使用空表单重新初始化电子邮件。您也没有创建或访问将保存电子邮件的电子邮件模型实例。
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()来保存模型。
答案 2 :(得分:1)
你有三个错误。首先,您应该使用索引视图将EmailForm传递给index.html。其次,您现在在索引视图中拥有的内容(根据之前的答案进行了更正)应移至感谢视图,以便检索用户在EmailForm中输入的内容。最后,您必须更正模板,以便包含传递的EmailForm。
答案 3 :(得分:1)
我认为,您的表单无法生效,因此未提交。那你为什么不写这样的模板:
<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')
答案 4 :(得分:1)
您正在使用请求数据保存空表单而不是模型中的from数据。 使用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,})