python - 创建填充表单的新模型对象
问题描述
我之前发表了另一篇关于此的帖子,但我认为我解释错了。我的班级名为“Empresa”。该网页的用户可以通过在视图中填充 ModelForm 来注册他们自己的公司(“Empresa”)。问题是我在任何地方都找不到语法。我有:
模型.py:
from django.db import models
class EmpresaManager(models.Manager):
def create_empresa(self):
empresa = self.create()
return empresa
class Empresa(models.Model):
codigo = models.CharField(max_length=3, null=False, default='000')
nombre = models.CharField(max_length=100, null=False, default='Sin nombre')
email = models.EmailField(null=False, default='email@empresa.com')
direccion = models.CharField(max_length=100, null=False, default='Sin direccion')
localidad = models.CharField(max_length=100, null=False, default='Sin localidad')
codDgi = models.SmallIntegerField(null=True)
docDgi = models.CharField(max_length=13, null=True)
sIva = models.CharField(max_length=1, null=True, default='1')
mesCierre = models.IntegerField(null=True, default=0)
fecIni = models.DateField(null=True)
ruca = models.IntegerField(null=True)
novedad = models.CharField(max_length=50, null=True, default='')
fecNovedad = models.DateTimeField(null=True)
ultVersion = models.CharField(max_length=20, null=True, default='')
logo = models.ImageField(null=True)
habilitado = models.CharField(max_length=1, null=True, default='S')
codEmpresa = models.CharField(max_length=3, null=True)
codComp = models.CharField(max_length=3, null=True, default='')
objects = EmpresaManager()
表格.py:
from django import forms
from django.forms import ModelForm
from .models import Empresa
class RegistroEmpresaForm(ModelForm):
class Meta:
model = Empresa
fields = ["nombre", "docDgi", "email"]
视图.py:
from django.shortcuts import render
from Empresa.forms import RegistroEmpresaForm
from Empresa.models import Empresa
from django.http import HttpResponse
def registrado(request):
form = RegistroEmpresaForm(request.POST or None)
titulo = "Registro SIG | ERZ Software"
context = {
"form": form,
"titulo": titulo,
}
empresa = Empresa.objects.create_empresa()
empresa.nombre = form.cleaned_data.get('nombre')
empresa.docDgi = form.cleaned_data.get('docDgi')
empresa.email = form.cleaned_data.get('email')
empresa.save(nombre=empresa.nombre, docDgi=empresa.docDgi, email=empresa.email)
return HttpResponse("Gracias por registrarse.")
def registro(request):
form = RegistroEmpresaForm(request.POST or None)
titulo = "Registro SIG | ERZ Software"
context = {
"form": form,
"titulo": titulo,
}
return render(request, "registro.html", context)
registro.html:(部分)
</style>
<!-- Custom styles for this template -->
<link href="{% static 'css/SIG.css' %}" rel="stylesheet">
</head>
<body class="text-center">
{% block content %}
<form class="form-signin" method="POST" action="registrado" enctype="application/x-www-form-urlencoded">{% csrf_token %}
<img class="mb-4" src="/docs/4.2/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">Panel de registro</h1>
{{ form }}
<button class="btn btn-lg btn-primary btn-block" type="submit">Registrarme</button>
<p class="mt-5 mb-3 text-muted">© ERZSoftware 2019 - Todos los derechos reservados</p>
</form>
{% endblock %}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
</body>
</html>
我知道我的观点有问题,问题是我找不到语法。 我知道如何使用 ModelForm 填充视图,但我无法使用 ModelForm 中的填充数据创建新的 empresa 对象。我会很感激任何帮助,谢谢!!
解决方案
每个 ModelForm 也有一个 save() 方法。此方法从绑定到表单的数据中创建并保存一个数据库对象。ModelForm 的子类可以接受现有模型实例作为关键字参数实例;如果提供了这个, save() 将更新该实例。如果未提供, save() 将创建指定模型的新实例:
另请注意,您应该对 GET 和 POST 请求使用相同的视图 - django 中的规范“表单”视图函数如下所示:
def myview(request):
if request.method == "POST":
form = MyModelForm(request.POST)
if form.is_valid():
my_instance = form.save()
# you can redirect wherever you want,
# as long as you redirect - cf
# https://en.wikipedia.org/wiki/Post/Redirect/Get
# You may also want to use tyhe messages framework
# to notify the user the action has been succesful
return redirect(my_instance.get_absolute_url())
else:
# GET method, provide an empty form
form = MyModelForm()
return render(request, "mytemplate.html", {"form": form})
推荐阅读
- c# - ASP.NET Core 从 azure 和数据库中删除图像 blob
- eclipse - Eclipse Navigator 中消失的文件的补丁
- c++ - 如何隐藏文件而不更改属性?
- flutter - 导航后打开颤振对话框
- rotation - 比较组成 360 度图像的 2 个旋转图像
- asp.net-core - identityserver 4 获取当前用户的 access_token
- angular - 以编程方式提交表单时,FormGroupDirective 提交的值不会改变
- android - 将 RadListView 放置在 Grid 中可以解决 iOS 滚动问题,但在 Android 上会中断
- visual-studio - 如何禁用烦人的提示?
- python - python无法将函数结果存储在变量中