首页 > 解决方案 > 如何从 ModelForm 中保存数据?

问题描述

我是 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

谢谢

标签: djangoformsdjango-models

解决方案


因为在表单动作中你已经写action="/person/persons-list/"了,所以当你提交表单时,它/person/persons-list/不会点击create_person_view视图。因此将其更改为action="/person/create/"(或人员创建视图的 url)。


推荐阅读