2017-08-15 157 views
0

在我的Django應用程序中,我有一個帶有電子郵件和文本區域的表單,需要進入數據庫,但是很難做到這一點。目前,我有我的代碼2個不同的解決方案:將表單保存到數據庫(Django Python)

the code

+4

請將您的代碼作爲文本發佈,而不是圖片。它使人們更容易幫助你。 – Jonathan

+0

簡化圖片 – Fabien

回答

0

如果我理解正確的話,那麼你應該先建立一個模型(與電子郵件字段和文本字段(CharField),(然後自動在運行django migrate時創建數據庫中的表),那麼您應該從創建的Model中創建一個ModelForm,這是最簡單,最快速的基本解決方案,它會自動將表單保存在數據庫中(使用.save()方法)然後,您不會在保存過程中混淆表格和模型字段。

有關ModelForms的參考信息,請參閱: https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/

因此,最好直接從模型創建表單。

在你具體的例子(你不匹配的字段保存,這就是爲什麼它不工作):

,我看到你在views.py文件中創建一個「get_question」功能。在該功能,你應該改變你的代碼的節省部分,包括像這樣:

# from .models import Contact 

saving_all = Contact.objects.create(contact_email = form_email, contact_question = form_question) 

的代碼將在您的聯繫表保存在數據庫中的表這部分數據。

它與您在view.py中的原始方法(您不匹配字段的位置)中的代碼保存的代碼相同。它應該是這樣的,如果糾正:

# from .models import Contact 

contact = Contact(contact_email=form_email, contact_question=form_question) 
contact.save() 

更清楚:下面這段代碼是工作在views.py並從形式到聯繫人模型(表)數據庫保存數據(使用自己的APP_NAME如果需要的話,當然代碼):

from django.shortcuts import render 
from . import forms 
from . import models 
from django.http import HttpResponse 

def get_question(request): 
    form = forms.QuestionForm() 

    if request.method == 'POST': 
     form = forms.QuestionForm(request.POST) 

     if form.is_valid(): 
      form_email = form.cleaned_data['your_email'] 
      form_question = form.cleaned_data['your_question'] 
      saving_all = models.Contact.objects.create(contact_email=form_email, contact_question=form_question) 
      return HttpResponse('Success') 
    else: 
     form = forms.QuestionForm() 

    return render(request, 'basic_app/contact.html', {'form':form}) 

而且你的模型看起來像這樣在models.py:

from django.db import models 

# Create your models here. 

class Contact(models.Model): 
    contact_email = models.EmailField(max_length=80) 
    contact_question = models.CharField(max_length=600) 

和你在forms.py形式如下:

from django import forms 

class QuestionForm(forms.Form): 
    your_email = forms.EmailField() 
    your_question = forms.CharField(widget = forms.Textarea) 
+0

仍然不能正常工作,我的'def contact(request):'應該如何在views.py中顯示? get_question函數如何被調用? – Lode

0

好的,讓我從頭開始寫。如果你現在進行下面的步驟來練習,也許會更好。

現在,正確的方法來完成上述任務(我嘗試清除這個問題多一點,因爲我知道許多其他人會閱讀這個問題,他們也可以從中學習,而且理解它很重要爲您的將來的任務

如果你想創建一個表單,並且你知道你想要將提交的數據從該表單保存到數據庫,那麼當然你應該開始創建一個模型的整個任務,因此一個在數據庫中的表格

因此,首先你要創建一個模型(在這種情況下你將調用ie。「Questions」,因爲你想調用你的表單即QuestionForm,所以如果你的模型表格也將與他們的名字相關)。

所以你的模型將會在你的模型中。PY文件:

from django.db import models 
# Create your models here. 

class Questions(models.Model): 
    contact_email = models.EmailField(max_length=60) 
    question = models.CharField(max_length=600) 

然後你會在你的forms.py文件創建這個的ModelForm方式如下:

from django import forms 
from django.forms import ModelForm, Textarea 
from . import models 

class QuestionForm(ModelForm): 
    class Meta: 
     model = models.Questions 
     fields = ['contact_email', 'question'] 
     widgets = { 
      'question': Textarea(attrs={'cols': 40, 'rows': 20}), 
     } 

然後你在views.py文件中創建您的視圖功能:

from django.shortcuts import render, redirect 
from . import forms 
from . import models 
from django.http import HttpResponse 

def get_question(request): 
    form = forms.QuestionForm() 

    if request.method == 'POST': 
     form = forms.QuestionForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect(‘success.html’) # or you redirect anywhere you want to 
    else: 
     form = forms.QuestionForm() 

    return render(request, 'contact.html', {'form':form}) 

在這一點上,你會在你的urls.py中創建你的urlpattern來調用get_question視圖函數。它看起來像下面這樣:

from django.conf.urls import url 
from basic_app import views 

# app_name = 'basic_app' # Important for referencing urls in HTML pages(use your own app_name here). But for this example task this is not important. 

urlpatterns = [ 
url(r'^$', views.home, name='home'), 
url(r'^questions/', views.get_question, name="questions_page"), 
] 

我希望我沒有更多地混淆你。如果你執行上述步驟,它應該適合你。您可以按照上述步驟創建任意數量的表單,並將其輕鬆保存到數據庫中。

您必須具備的其他操作才能運行上述操作,您的'contact.html'頁面已經存在,而且您已經創建了該頁面。

(不要忘了運行:蟒蛇manage.py遷移)

所以,我希望你看,在上面的例子中你沒有錯配域和域名,你就不會感到困惑什麼保存在哪裏。由於模型和表單一起工作並且使用相同的字段名稱一起創建。

+0

它的工作原理!非常感謝:)與我以前的模型結構發生衝突時出現問題,這是它第二次不能正常工作的原因。 – Lode

+0

OK @Lode,太棒了,我很高興它現在對你有效,你認識到了這個問題! (請點擊答案旁邊的複選標記,將它從空白轉換爲綠色,這樣我們就可以關閉這個問題)。我希望你能在Forms和Models中獲得良好的開發時間! – Zollie