Django表单提交(我认为)但不发送到数据库

时间:2014-06-20 18:59:32

标签: python django forms

以下是我认为应该是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">&times;</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 个答案:

答案 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,})