У меня есть две модели, одна со многими полями.Две модельные формы (потому что у одной есть листовка-виджет), и мне нужно, чтобы эти формы отображались индивидуально по полю в шаблоне.Я получаю их отображать правильно, но форма не сохраняется.Я думаю, что в представлениях должна быть ошибка, но я не могу ее найти
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>
...