Django-表单未显示在模板上

时间:2019-12-19 02:41:54

标签: html django python-3.x django-forms

我正在做一个项目,结果遇到了一些问题。我无法使表单完全显示在模板中。

代码:

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>

1 个答案:

答案 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})