簡體   English   中英

將表單保存到數據庫(Django Python)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM