2014-06-20 451 views
0

以下是我認爲應該是bootstrap3模式中的電子郵件提交表單的工作版本的代碼。表單提交後,我被帶到準系統謝謝頁面,但我不認爲電子郵件地址正在發送到數據庫,因爲我在Django admin中看不到。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 --> 

回答

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

@Rohan感謝更好forms.py

from django.forms import ModelForm from temp.models import Email class EmailForm(forms.ModelForm): class Meta: model = Email 

這一點。在你的第二個代碼中,是否改變了models.py或forms.py? – metersk

+1

@Barnaby,那就是表單。 – Rohan

+0

嗯,它仍然沒有提交給數據庫。此外,它似乎仍然接受無效的電子郵件 – metersk

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.save()直接保存模型。

+0

與ModelForms一起嘗試此操作,但它仍然無法正常工作。另外,它在表單提交後甚至不會發送到thanks.html頁面。 – metersk

+0

你可以連接一個pdb並告訴我錯誤在哪裏。 – zaphod

1

你有三個錯誤。首先,您應該使用索引視圖將EmailForm傳遞給index.html。其次,您現在在索引視圖中(根據以前的答案進行了更正)應該將其移至感謝視圖,以便檢索用戶在EmailForm中輸入的內容。最後,你必須糾正你的模板,所以包括EmailForm傳遞。

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') 
1

你,而不是從數據與請求數據模型保存一個空的形式。 使用ModelForm更加簡單容易,只需保存表單就足夠了。 並使用EmailField代替CharField是電子郵件地址字符串

的驗證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,}) 
+0

在forms.py代碼中得到這個錯誤:'NameError在/ name'forms'未定義'爲什麼? – metersk

+0

你有什麼版本的Django正在運行?你在哪裏得到那個錯誤?我的意思是在像ipython這樣的控制檯或調試頁面中? – elmonkeylp

+0

版本1.6.5和調試頁面 – metersk

相關問題