Pracuję nad projektem i miałem pewne problemy. W ogóle nie mogę sprawić, by formularz był wyświetlany w szablonie.

Kod:

models.py Bardzo podstawowa baza danych.

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 klasa formularza z polami, widżetami i atrybutami (nadal podstawowa).

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 Myślę, że problem występuje gdzieś w metodzie 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 %}

EDYTUJ

W końcu to dostałem. Użyłem widoków opartych na klasach i działało dobrze:

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
Facundo Flores 19 grudzień 2019, 05:41
Czy czytałeś [docs.djangoproject.com/en/3.0/intro /tutorial04/](to) samouczek z oficjalnego django?
 – 
do thuan
19 grudzień 2019, 05:46

1 odpowiedź

Użyj tego kodu dla metody 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})
0
Iqbal Hussain 19 grudzień 2019, 06:13
Bardzo dziękuję za odpowiedź, ale u mnie to nie zadziałało... nadal nie wyświetli się formularz.
 – 
Facundo Flores
20 grudzień 2019, 00:03
@FacundoFlores, formulario.html Dodaj bezpośrednio: {form} w dowolnym div, aby zobaczyć, czy formularz działa?
 – 
Iqbal Hussain
20 grudzień 2019, 13:30