如何保存来自ModelForm的数据?

时间:2019-11-29 08:31:11

标签: django forms django-models

我是Django的新手,所以我试图构建一个包含大多数基本概念的虚拟站点,但是当涉及从表单保存数据时,我真的很努力。

我看了很多视频,并按照教程进行了所有工作,但是它们都使用不同的方法以及基于类的视图。我要做的就是按照Django文档从表单中保存一些数据。

此阶段的项目非常简单:在导航栏中带有一个标记为“ Person”的下拉菜单的主页。用户可以从下拉菜单中选择两个链接,即“人员列表”和“创建人员”。

现在,我正在使用基于函数的视图,正如您从views.py中看到的

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


# Create your views here.
def home_view(request):
    return render(request, 'home.html')


def persons_list_view(request):
    persons = Person.objects.all()
    context = {
        'persons': persons
    }
    return render(request, 'persons_list.html', context)


def create_person_view(request):
    if request.method == 'POST':
        form = CreatePersonForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
            return HttpResponse('Working!')
    else:
        form = CreatePersonForm()
    context = {'form': form}
    return render(request, 'create_person.html', context) 

从这些函数中,我派生出表单来创建Person类的实例,因此我正在使用ModelForm类,如forms.py中所示。

from django import forms
from .models import Person


class CreatePersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = [
            'first_name',
            'last_name',
            # 'adult',
            # 'date_of_birth',
            # 'high_in_meters',
            # 'age',
            # 'email',
            # 'portrait',
            # 'number_of_cars_owned',
            # 'smartphone',
            # 'smartphone',
            # 'pets',
            # 'national_insurance_number',
            # 'balance',
        ]

我的models.py如下所示(大多数类属性被注释掉只是因为我不想出现一些验证错误)。

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator


# Create your models here.
class Smartphone(models.Model):
    brand = models.CharField(max_length=20, default='Apple')
    model = models.CharField(max_length=20, default='Iphone X')


class Pet(models.Model):
    species = models.CharField(max_length=20, default='Cat')


class NationalInsuranceNumber(models.Model):
    alphanumerical_value = models.CharField(max_length=9, default='ABC15VFT')


class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=30)
    # adult = models.BooleanField(default=False)
    # date_of_birth = models.DateField(default=None)
    # created_on = models.DateTimeField(auto_now_add=True, auto_now=False)
    # updated_on = models.DateTimeField(auto_now_add=False, auto_now=True)
    # high_in_meters = models.DecimalField(max_digits=3, decimal_places=2, default=None)
    # age = models.DurationField(default=None)
    # email = models.EmailField(default='email@example.com')
    # portrait = models.ImageField(upload_to='media/', default=None, null=True, blank=True)
    # number_of_cars_owned = models.IntegerField(default=None, validators=[MinValueValidator(0), MaxValueValidator(10)])
    # smartphone = models.ForeignKey('Smartphone', on_delete=models.CASCADE, default=None, null=True, blank=True)
    # pets = models.ManyToManyField('Pet', blank=True)
    # national_insurance_number = models.OneToOneField('NationalInsuranceNumber',
    #                                                  on_delete=models.CASCADE,
    #                                                  default=None,
    #                                                  null=True, blank=True)
    # balance = models.IntegerField(default=None)

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

最后,这是我的create_person.html模板,效果很好

{% extends 'base.html' %}}

{% block content %}
<div class="jumbotron jumbotron-fluid mt-4 ">
    <div class="container">
        <h1 class="display ml-5 -4 mt-4 " align="center">Create Person</h1>
        <div class="container mt-3 mb-3">
            <div class="mt-5 ml-5">
                <form action="/person/persons-list/" method="post">{% csrf_token %}
                    {{ form.as_p }}
                    <input type="submit" value="Create Person">
                </form>
            </div>
        </div>
    </div>
</div>
{% endblock %}

有人知道如何解决此问题,以使表格实际保存数据吗? 如果可能的话,我宁愿坚持使用基于函数的视图和模型形式,而不是基于这些基础形式。基于表单和类的视图。

这是我在运行服务器时在终端中获得的信息:

  1. 从“主页”下拉列表中单击“创建人”
  2. 使用值“ John”和“ Smith”填充表单
  3. 单击“创建人”按钮。

根据需要,它带我到人员列表页面,但是没有人创建,因此没有显示在列表中。 (如果我使用管理页面创建人员,则列表页面可以正常工作)

System check identified no issues (0 silenced).
November 29, 2019 - 08:25:39
Django version 2.2.7, using settings 'my_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[29/Nov/2019 08:25:40] "GET / HTTP/1.1" 200 2703
[29/Nov/2019 08:25:48] "GET /person/create-person/ HTTP/1.1" 200 3145
[29/Nov/2019 08:25:53] "POST /person/persons-list/ HTTP/1.1" 200 2581

谢谢

1 个答案:

答案 0 :(得分:3)

由于您在表单操作中已经编写了action="/person/persons-list/",因此,在提交表单时,表单将转到/person/persons-list/,不会打入create_person_view视图。因此,将其更改为action="/person/create/"(或个人创建视图的网址)。