我是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 %}
有人知道如何解决此问题,以使表格实际保存数据吗? 如果可能的话,我宁愿坚持使用基于函数的视图和模型形式,而不是基于这些基础形式。基于表单和类的视图。
这是我在运行服务器时在终端中获得的信息:
根据需要,它带我到人员列表页面,但是没有人创建,因此没有显示在列表中。 (如果我使用管理页面创建人员,则列表页面可以正常工作)
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
谢谢
答案 0 :(得分:3)
由于您在表单操作中已经编写了action="/person/persons-list/"
,因此,在提交表单时,表单将转到/person/persons-list/
,不会打入create_person_view
视图。因此,将其更改为action="/person/create/"
(或个人创建视图的网址)。