【问题标题】:Django form submits (I think) but does not send to databaseDjango 表单提交(我认为)但不发送到数据库
【发布时间】:2014-06-20 18:59:31
【问题描述】:

下面是我认为应该是 bootstrap3 模式中电子邮件提交表单的工作版本的代码。提交表单后,我被带到了准系统谢谢页面,但我认为电子邮件地址没有被发送到数据库,因为我在 Django admin 中看不到。

另外,我认为这被破坏的另一个原因是表单验证似乎不起作用。我可以提交看起来不像电子邮件地址的东西,但我仍然会被发送到感谢页面。

我的所有文件都存在问题,还是仅存在于特定区域?

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 -->

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    将您的视图更新为

    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
    

    【讨论】:

    • @Rohan 谢谢。在您的第二段代码中,是对 models.py 还是 forms.py 的更改?
    • @Barnaby,这就是表格。
    • 嗯,它仍然没有提交到数据库。此外,它似乎仍在接受无效电子邮件
    • 您可能还想使用 EmailField 而不是 CharField 进行电子邮件验证。
    • 为什么要在 email 变量中保存 form.save()?我认为只需执行 form.save() 就足够了。
    【解决方案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()来保存模型。

    【讨论】:

    • 结合 ModelForms 试过了,还是不行。此外,它甚至不会在表单提交后发送到Thanks.html 页面。
    • 你能连接一个 pdb 并告诉我错误在哪里吗?
    【解决方案3】:

    你有三个错误。首先,您应该使用索引视图将 EmailForm 传递给 index.html。其次,您现在在索引视图中拥有的内容(根据之前的答案更正)应该移动到感谢视图,以便检索用户在 EmailForm 中输入的内容。最后,您必须更正您的模板,以便包含传递的 EmailForm。

    【讨论】:

      【解决方案4】:

      我认为,您的表单没有生效,所以它没有被提交。那你为什么不这样写你的模板:

      <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
      

      编辑

      如果您想继续使用您的模板,那么我建议您放弃该表单。在views中,你会通过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')
      

      【讨论】:

        【解决方案5】:

        您正在使用请求数据保存一个空表单,而不是模型中的来自数据。 使用 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,})
        

        【讨论】:

        • 在 forms.py 代码中出现此错误:NameError at / name 'forms' is not defined 知道为什么吗?
        • 你运行的是什么版本的 Django?你在哪里得到那个错误?我的意思是在 ipython 之类的控制台或调试页面中?
        • 版本 1.6.5 并在调试页面中
        • 您正在导入这样的表单from temp.forms import EmailForm?
        • 是的,完全复制了您的代码。我猜是forms.py中的错误?
        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        相关资源
        最近更新 更多