[英]Saving a Form to a Database (Django Python)
在我的Django應用程序中,我有一個包含電子郵件和文本區域的表格,需要進入數據庫,但是卻很難做到這一點。 目前,我的代碼中有2種不同的解決方案:
如果我對您的理解正確,則應首先創建一個模型(帶有電子郵件字段和文本字段(CharField),然后在運行django migration時自動在數據庫中創建表),然后應從中創建一個ModelForm。創建的模型,這是最簡單,最快,最基本的解決方案,它將自動將您的Form保存到數據庫中(使用.save()方法),並且在保存過程中不會混淆Form和Model字段。
有關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 )
這部分代碼會將您的表單數據保存在數據庫的“聯系人”表中。
它使用原始方法在views.py(與字段不匹配的地方)中保存與此代碼相同的內容。 如果更正,它應該看起來像這樣:
# from .models import Contact
contact = Contact(contact_email=form_email, contact_question=form_question)
contact.save()
更清楚的是:下面的代碼在views.py中工作,並將表單中的數據保存到Contact Model(table)中的數據庫中(當然,如果需要,在代碼中使用您自己的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中的Form如下所示:
from django import forms
class QuestionForm(forms.Form):
your_email = forms.EmailField()
your_question = forms.CharField(widget = forms.Textarea)
好,讓我從頭開始寫。 如果您現在和我一起執行以下步驟進行鍛煉,也許會更好。
現在,完成上述任務的正確方法(我嘗試進一步澄清該主題,因為我知道許多其他人也會閱讀此問題,他們也可以從中學習。對於您的未來任務,理解它很重要。
如果您要創建一個表單,並且知道要將表單中的提交數據保存到數據庫中,那么您當然應該通過創建一個模型來開始整個任務,從而在數據庫中創建一個表。
因此,首先,您要創建一個模型(在本例中,您將其稱為“問題”,因為您要調用表格即QuestionForm,因此最好將模型和表也與其名稱相關聯) )。
因此,您的模型將在您的models.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”頁面。
(不要忘記運行:python manage.py migration)
因此,我希望您能在上面的示例中看到字段和字段名稱不匹配,並且不要對保存位置的內容感到困惑。 由於模型和表單是一起工作的,並且使用相同的字段名稱一起創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.