我正在做一个项目,结果遇到了一些问题。我无法使表单完全显示在模板中。
代码:
models.py 一个非常基本的数据库。
from django.db import models
class Cliente(models.Model):
nombre_cliente = models.CharField(max_length=200)
domicilio_real = models.CharField(max_length=200)
domicilio_obra = models.CharField(max_length=200)
correo = models.EmailField()
telefono = models.CharField(max_length=200)
fecha_alta_cliente = models.DateField()
fecha_inicio_obra = models.DateField()
fecha_fin_obra = models.DateField()
forms.py 一个具有字段,小部件和属性(仍然是基本的)的表单类。
from django import forms
from .models import Cliente
class CargarForm(forms.Form):
nombre_cliente = forms.CharField(
label='Nombre del cliente:', max_length=200, widget=forms.TextInput(attrs={'class': 'form-control' 'input-50'}))
domicilio_real = forms.CharField(
label='Domicilio real:', max_length=200, widget=forms.TextInput(attrs={'class': 'form-control'}))
domicilio_obra = forms.CharField(
label='Domicilio de obra:', max_length=200, widget=forms.TextInput(attrs={'class': 'form-control'}))
correo = forms.EmailField(
label='Correo electrónico:', max_length=254, widget=forms.EmailInput(attrs={'class': 'form-control'}))
telefono = forms.CharField(
label='Teléfono:', max_length=200, widget=forms.TextInput(attrs={'class': 'form-control'}))
fecha_alta_cliente = forms.DateField(
label='Fecha de alta de cliente:', widget=forms.SelectDateWidget(years=range(2019, 2100), attrs={'class': 'form-control'}))
fecha_inicio_obra = forms.DateField(
label='Fecha de inicio de obra:', widget=forms.SelectDateWidget(years=range(2019, 2100), attrs={'class': 'form-control'}))
fecha_fin_obra = forms.DateField(
label='Fecha de alta de cliente:', widget=forms.SelectDateWidget(years=range(2019, 2100), attrs={'class': 'form-control'}))
error_messages = {
'nombre_cliente': {
'required': ("El nombre del cliente es obligatorio"),
},
'domicilio_real': {
'required': ("El domicilio real es obligatorio"),
},
'domicilio_obra': {
'required': ("El domicilio de obra es obligatorio"),
},
'correo': {
'required': ("Debe proporcionar correo electrónico"),
},
'fecha_alta_cliente': {
'required': ("Debe informar la fecha de alta del cliente"),
},
}
def __init__(self, *args, **kwargs):
super(CargarForm, self).__init__(*args, *kwargs)
views.py ,我相信问题出在cargar_cliente方法中。
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.template import RequestContext, loader
from arqumhome.models import Cliente
from arqumhome.forms import CargarForm
def index(request):
contenido = {'nombre_sitio': 'Arqum'}
return render(request, 'arqumhome/index.html', contenido)
def altacliente(request):
return render(request, 'arqumhome/altacliente.html')
def bajacliente(request):
return render(request, 'arqumhome/bajacliente.html')
def consultacliente(request):
return render(request, 'arqumhome/consultacliente.html')
def cargar_cliente(request):
if request.method == 'POST':
form = CargarForm(request.POST)
if form.is_valid():
nombre_cliente = form.cleaned_data['nombre_cliente']
domicilio_real = form.cleaned_data['domicilio_real']
domicilio_obra = form.cleaned_data['domicilio_obra']
correo = form.cleaned_data['correo']
telefono = form.cleaned_data['telefono']
fecha_alta_cliente = form.cleaned_data['fecha_alta_cliente']
fecha_inicio_obra = form.cleaned_data['fecha_inicio_obra']
fecha_fin_obra = form.cleaned_data['fecha_fin_obra']
newcliente = Cliente(nombre_cliente=nombre_cliente, domicilio_real=domicilio_real, domicilio_obra=domicilio_obra, correo=correo,
telefono=telefono, fecha_alta_cliente=fecha_alta_cliente, fecha_inicio_obra=fecha_inicio_obra, fecha_fin_obra=fecha_fin_obra)
newcliente.save()
return redirect("index")
else:
form = CargarForm()
return render(request, 'arqumhome/formulario.html', {'form': form})
urls.py
from django.urls import path
from arqumhome import views
urlpatterns = [
path('', views.index, name='index'),
path('altacliente', views.altacliente, name='altacliente'),
path('bajacliente', views.bajacliente, name='bajacliente'),
path('consultacliente', views.consultacliente, name='consultacliente'),
path('cargar_cliente', views.cargar_cliente, name='cargar_cliente'),
]
formulario.html
{% block formulario %}
<form action="{% url 'cargar_cliente' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="{{ field.name }}">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
</form>
{% endblock %}
编辑
我终于明白了。我使用了基于类的视图,并且效果很好:
views.py
class FormularioDeAlta(View):
template = 'arqumhome/altacliente.html'
def get(self, request):
form = CargarForm()
params = {}
prueba = "dato de prueba"
params['prueba'] = prueba
params['form'] = form
return render(request, self.template, params)
def post(self, request):
# if request.method == 'POST':
#form = CargarForm(request.POST)
if request.method == 'POST':
form = CargarForm(request.POST)
if form.is_valid():
try:
nombre_cliente = form.cleaned_data['nombre_cliente']
domicilio_real = form.cleaned_data['domicilio_real']
domicilio_obra = form.cleaned_data['domicilio_obra']
correo = form.cleaned_data['correo']
telefono = form.cleaned_data['telefono']
fecha_alta_cliente = form.cleaned_data['fecha_alta_cliente']
fecha_inicio_obra = form.cleaned_data['fecha_inicio_obra']
fecha_fin_obra = form.cleaned_data['fecha_fin_obra']
newcliente = Cliente(nombre_cliente=nombre_cliente, domicilio_real=domicilio_real, domicilio_obra=domicilio_obra, correo=correo,
telefono=telefono, fecha_alta_cliente=fecha_alta_cliente, fecha_inicio_obra=fecha_inicio_obra, fecha_fin_obra=fecha_fin_obra)
newcliente.save()
return redirect('index')
except:
pass
else:
form = CargarForm()
# return render(request, 'arqumhome/altacliente.html', {'form': form})
altacliente.html:
<<form action="{% url 'cargar' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<strong><label for="{{field.name}}">{{field.label}}</label></strong>
{% render_field field class='form-control' %}
</div>
{% endfor %}
<br>
<div class="col-sm-2">
<input type="submit" class="btn-lg btn-block btn-primary" value="Dar de alta"></input>
</div>
</form>
答案 0 :(得分:0)
将此以下代码用于 cargar_cliente 方法
def cargar_cliente(request):
form = CargarForm(request.POST or None)
if form.is_valid():
nombre_cliente = form.cleaned_data['nombre_cliente']
domicilio_real = form.cleaned_data['domicilio_real']
domicilio_obra = form.cleaned_data['domicilio_obra']
correo = form.cleaned_data['correo']
telefono = form.cleaned_data['telefono']
fecha_alta_cliente = form.cleaned_data['fecha_alta_cliente']
fecha_inicio_obra = form.cleaned_data['fecha_inicio_obra']
fecha_fin_obra = form.cleaned_data['fecha_fin_obra']
newcliente = Cliente(nombre_cliente=nombre_cliente, domicilio_real=domicilio_real, domicilio_obra=domicilio_obra, correo=correo,
telefono=telefono, fecha_alta_cliente=fecha_alta_cliente, fecha_inicio_obra=fecha_inicio_obra, fecha_fin_obra=fecha_fin_obra)
newcliente.save()
return redirect("index")
return render(request, 'arqumhome/formulario.html', {'form': form})