为什么有很多有两个模型的表单不能正确保存?

2024-09-30 16:31:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型,一个有多对多领域。两个模型表单(因为其中一个有一个传单小部件),我需要在模板中按字段分别显示这些表单。 我让它们正确显示,但表单未保存。我认为观点中一定有错误,但我找不到

models.py

class Contribuyente(models.Model):
    nombre = models.CharField(max_length=20)
    CONTRIBUYENTES = (
        ('Pr', 'Productor'),   
        ('VI', 'Vendedor de insumos'),
        ('E', 'Empresa'),
        ('I', 'Institución'), 
    )
    tipo_de_contribuyente = models.CharField(max_length=2, choices=CONTRIBUYENTES, primary_key=True, help_text="¿Quién sos?")


    def __str__(self):
        return self.tipo_de_contribuyente


class Ensayo(models.Model):
    CONTRIBUCION = (
        ('H', 'Hibridos_Maiz'),
        ('VS', 'Variedades_Soja'),
        ('F', 'Fertilizantes'),
        ('H', 'Herbicidas'),
        ('I', 'Insecticidas'),
        ('F', 'Fungicidas'),
        ('C', 'Coadyudantes'),
        ('In', 'Inoculantes'),
        )

    nombre_contribucion = models.CharField(max_length=280)
    tipo_de_contribucion = models.CharField(max_length=2, choices=CONTRIBUCION, primary_key=True, help_text="Seleccioná sobre que contribuís")
    fecha = models.DateField(default=datetime.date.today)
    contribuyentes = models.ManyToManyField(Contribuyente)
    archivos = models.FileField(upload_to='archivos_de_ensayos/', null=True, blank=True)
    texto = models.TextField()
    geom1 = models.MultiPointField(null=True)  

    def __str__(self):
        return self.tipo_de_contribucion

forms.py

class ContribuyenteForm(ModelForm):
    class Meta:
        model = Contribuyente
        fields = ['nombre', 'tipo_de_contribuyente']

class CustomLeafletWidget(LeafletWidget):
    geometry_field_class = 'YourGeometryField'

class EnsayoForm(ModelForm):
    class Meta:
        model = Ensayo
        fields = ['tipo_de_contribucion','nombre_contribucion', 'fecha','archivos','texto','geom1']
        exclude = ['contribuyentes']
        widgets = {
            'fecha': forms.DateInput(attrs={'class': 'datetime-input'},),
            'geom1': CustomLeafletWidget()
        }
        labels = {
            'texto': _('Texto de aporte'),
            'archivos': _('Archivos:'),
        }
        help_texts = {
            'texto': _('Escribe sobre el aporte que quieras compartir, sé lo más simple y preciso para facilitar su interpretación. '),
            'archivos': _("Subi archivos sobre tu aporte o ensayo (PDF's, Word, Excel,etc), imágenes o incluso archivos en formato .shp. "),
        }

    def clean_texto(self):
        data = self.cleaned_data['texto']

        if data == "":
         raise forms.ValidationError('Este campo no puede quedar vacío!')

        return data 

views.py

class EnsayoView(View):
    template_name = 'listado_de_lotes.html'
    ensayo = EnsayoForm
    contribuyente = ContribuyenteForm


    def get(self, request):
        form1 = self.ensayo(None)
        form2 = self.contribuyente(None)

        return render(request, self.template_name, { 'ensayo':form1, 'contribuyente':form2})


    def post(self, request):

        if request.method == 'POST' and 'htmlsubmitbutton1' in request.POST:

            form1 = EnsayoForm(request.POST) #Se crea una nueva instancia con POST Data.
            form2 = ContribuyenteForm(request.POST)

            if form1.is_valid() and form2.is_valid():
                nuevo_ensayo = form1.save(commit=False)
                nuevo_contribuyente = form2.save()

                nuevo_ensayo.save_m2m()

                return HttpResponseRedirect('/news/')

            else:
                print('no anduvo')
                return render(request, self.template_name, { 'ensayo':form1, 'contribuyente':form2 })

我只把模板的形式,因为它很长。你知道吗

template

<form action="" method="POST" >

   <div id="map" >
   {% csrf_token %}
   {{ ensayo.non_field_errors }}
   {{ ensayo.source.errors }}
   {{ ensayo.geom1 }}
   </div>

   <div class="leaflet-sidebar-pane" id="messages">
   {% csrf_token %}                 
   {{ contribuyente.non_field_errors }}
   {{ contribuyente.source.errors }}
   {{ contribuyente.nombre|as_crispy_field }}
   {{ contribuyente.tipo_de_contribuyente|as_crispy_field }}
   </div>

   <div class="leaflet-sidebar-pane" id="profile">
   {% csrf_token %}
   {{ ensayo.non_field_errors }}
   {{ ensayo.source.errors }}
   {{ ensayo.nombre_contribucion|as_crispy_field }}
   {{ ensayo.tipo_de_contribucion|as_crispy_field }}

   {{ ensayo.fecha|as_crispy_field }}

   {{ ensayo.archivos|as_crispy_field }}
   {{ ensayo.texto|as_crispy_field }}

   <button type="submit" name="htmlsubmitbutton1">Realizar aporte</button>
   </div>

...

Tags: selffieldmodelsrequestasdeclasscrispy