django - 如何从 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 %}
有谁知道如何解决这个问题以使表单实际保存数据?如果可能的话,我宁愿坚持基于功能的视图和模型形式,而不是从基础面形式。基于表单和类的视图。
这是我在运行服务器时在终端中得到的,并且:
- 从主页下拉列表中单击创建人员
- 用值“John”和“Smith”填写表格
- 单击“创建人员”按钮。
根据需要,它会将我带到人员列表页面,但没有人被创建并因此显示在列表中。(如果我使用管理页面创建人员,列表页面可以正常工作)
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
谢谢
解决方案
因为在表单动作中你已经写action="/person/persons-list/"
了,所以当你提交表单时,它/person/persons-list/
不会点击create_person_view
视图。因此将其更改为action="/person/create/"
(或人员创建视图的 url)。
推荐阅读
- android - android KTX 是完全被弃用还是只有部分或扩展被弃用?
- apache - 如何将 domain.com/en/example1 更改为 domain.com/english/example1
- gradle - 多模块项目中的 Gradle 测试库
- ruby-on-rails - rbenv 多次调用常量 - 如何删除正确的常量
- c++ - 我可以对 boost::adaptors::transformed over std::array 的结果使用 boost::copy_range 来取回另一个 std::array 吗?
- python - 了解 keras 中的平均(总和)池填充
- javascript - 如何在 wordpress 中使输入值永久化或使用全局变量
- python - ImportError:无法从“google.cloud”(未知位置)导入名称“bigquery”
- python - Python selenium - 无法建立新连接:[Errno 61] 连接被拒绝
- python - %time await main() throws SyntaxError: 'await' outside function in jupyter