【问题标题】:Django: Save Form Data to DatabaseDjango:将表单数据保存到数据库
【发布时间】:2017-03-06 13:38:21
【问题描述】:

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

表格:

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 页面,但似乎仍然无法正常工作。

【问题讨论】:

  • 此代码会导致错误,因为普通的 Form 对象没有保存方法。由于您没有看到任何错误,因此您的表单必须无效或正在提交到不同的视图。
  • @DanielRoseman 谢谢丹尼尔,忽略了这一点。我的模板的操作是“/success/”,因此 POST 方法只运行视图“成功”中的代码(这只是一些说明它有效的文本)。因此,将我的模板操作更改为“/”(这是我编写代码的地方)会导致它保存。如果你想写它作为答案,我会接受它。

标签: django django-forms


【解决方案1】:

试试这个:

...
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() 步骤是不必要的。

预计到达时间:

您也可以尝试使用 ModelForm 和一些默认值或自定义保存方法,如下所示:

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()。

【讨论】:

【解决方案2】:
p = Person(name=name, 
           phone_number=number, 
           date_subscribed=datetime.now(), 
           messages_received=0)
p.save()

删除这两行。 添加如下:

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','YourProjectName.settings')

import django
django.setup()

Person.objects.get_or_create()

【讨论】:

  • 原因是您无法从所需的任何文件中编辑或添加数据
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多