KeyError при использовании CreateView на Django
при попытке создать объект 'Comprobante' выдает ошибку:
KeyError at /caja_chica/comprobantes/crear/
'comprobante'
Request Method: POST
Request URL: http://127.0.0.1:8000/caja_chica/comprobantes/crear/
Django Version: 3.2.5
Exception Type: KeyError
Exception Value:
'comprobante'
вот моя модель Comprobante:
class Comprobante(models.Model):
TIPO_A = 1
TIPO_B = 2
TIPO_C = 3
TIPO_T = 4
TIPO_X = 5
TIPO_CHOICES = (
(TIPO_A, 'A'),
(TIPO_B, 'B'),
(TIPO_C, 'C'),
(TIPO_T, 'T'),
(TIPO_X, 'X'),
)
caja_chica = models.ForeignKey(CajaChica, on_delete=models.PROTECT)
lote = models.ForeignKey(Lote, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='lote_comprobantes')
numero = models.CharField(max_length=13)
tipo = models.PositiveSmallIntegerField(choices=TIPO_CHOICES, default=TIPO_T)
ente = models.ForeignKey(Ente, on_delete=models.PROTECT)
fecha = models.DateField()
partida_presupuestaria = models.ForeignKey(PartidaPresupuestaria, on_delete=models.PROTECT)
detalle = models.CharField(max_length=100)
importe = models.DecimalField(max_digits=7, decimal_places=2)
history = HistoricalRecords()
def __str__(self):
return self.numero
#def save(self, *args, **kwargs):
# super(Comprobante, self).save(*args, **kwargs)
# self.caja_chica.disponible -= self.importe
# self.caja_chica.save()
def get_absolute_url(self):
"""
Devuelve la url para acceder a una instancia particular de Comprobante.
"""
return reverse('caja_chica:comprobante_update', args=[str(self.id)])
вот моя форма:
class ComprobanteForm(forms.ModelForm):
class Meta:
model = Comprobante
fields = ('__all__')
мой вид с помощью CreateView:
class ComprobanteCreate(SuccessMessageMixin, CreateView):
model = Comprobante
fields = '__all__'
success_url = reverse_lazy('caja_chica:comprobante_list')
success_message = "%(comprobante)s fue creado exitosamente"
и мой шаблон comprobante_form:
{% extends "caja_chica/base.html" %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'caja_chica:inicio' %}">Inicio</a> >
<a href="{% url 'caja_chica:comprobante_list' %}">Comprobantes</a> >
{% if comprobante.id %} {{ comprobante }} {% else %} Agregar {% endif %}
</div>
{% endblock %}
{% block content %}
<h1>{% if comprobante.id %} Modificar {% else %} Agregar {% endif %} Comprobante </h1>
<form action="" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Guardar" />
</form>
{% endblock %}
Я думаю, что это проблема вида, но я не понимаю проблему и не знаю, где она находится
Я попробовал передать контекст через функцию в представлении следующим образом:
def get_context_data(self, **kwargs):
context = super().get_context_data( **kwargs)
context['comprobante'] = None
print(context)
return context
В success_message
интерполируется не контекст, а cleaned_data
формы, то есть в данном случае все поля модели.
Таким образом, вы можете работать с:
class ComprobanteCreate(SuccessMessageMixin, CreateView):
model = Comprobante
fields = '__all__'
success_url = reverse_lazy('caja_chica:comprobante_list')
success_message = '%(numero)s fue creado exitosamente'