Django:将表单数据保存到数据库

问题描述:

我正在Django项目中使用表格来获取人们的姓名和电话号码,以便以后联系。遵循了包括Django文档在内的几本指南,但似乎不起作用。我的测试POST未出现在admin中,也无法通过manage.py shell访问。我在代码中的多行注释中留下了代码,以显示我尝试的另一种方法,以防万一。

I'm using a form in my Django project to get people's name and number for later contact. Followed several guides including the Django docs but it doesn't seem to work. My test POST doesn't appear in admin and it can't be accessed via the manage.py shell either. I left in the multi-line comment in my code to show another method I was trying just in case. Getting no errors thrown in my manage.py runserver logs either.

表格:

from django import forms

class SubscribeForm(forms.Form):
  name = forms.CharField(label='Your Name', max_length=100)
  phone_number = forms.CharField(label='Phone Number', max_length=12, min_length=10)

模板:

<form action="/success/" method="post">
  {% csrf_token %}
  {{ form }}
  <input type="submit" value="Submit" />
</form>

查看:

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from datetime import datetime

from .models import Person
from .forms import SubscribeForm

def home(request):
  # if this is a POST request we need to process the form data
  if request.method == 'POST':
    # create a form instance and populate it with data from the request:
    form = SubscribeForm(request.POST)
    # check whether it's valid:
    if form.is_valid():
        # process the data in form.cleaned_data as required
        p = form.save()
        '''
        name = form.cleaned_data['name']
        number = form.cleaned_date['phone_number']
        p = Person(name=name, phone_number=number, date_subscribed=datetime.now(), messages_recieved=0)
        p.save()
        '''
        # redirect to a new URL:
        return HttpResponseRedirect('/success/')
  # if a GET (or any other method) we'll create a blank form    
  else: 
    form = SubscribeForm()

  return render(request, 'texting/index.html', {'form': form})

我看了几段视频,读了很多SO页面,但似乎还是行不通。

I've watched several videos and read many SO pages, but still doesn't seem to work.

尝试一下:

...
if form.is_valid():
    name = form.cleaned_data['name']
    number = form.cleaned_data['phone_number']
    p = Person(name=name, phone_number=number, date_subscribed=datetime.now(), messages_received=0)
    p.save()
...

form.save()步骤

The form.save() step is unnecessary.

ETA:

您还可以尝试使用ModelForm和一些默认值或自定义保存方法,就像这样:

You could also try using a ModelForm and some defaults or a custom save method, like so:

class Person(models.Model):
    name = models.CharField(max_length=96)
    phone_number = models.CharField(max_length=12)
    date_subscribed = models.DateTimeField(default=datetime.now())
    messages_received = models.IntegerField(default=0)

from django.forms import ModelForm

class SubscribeForm(ModelForm):
    class Meta:
        model = Person
        exclude = ('date_subscribed','messages_received')

如果您使用ModelForm,那么form.save()就足够了要做。

If you use a ModelForm, the form.save() is all you'll have to do.