У меня проблема с простой задачей, которую я хочу выполнить. Я хочу загрузить список моделей, и когда пользователь нажимает кнопку, я хочу редактировать два поля выбранного экземпляра модели.
Я оставляю свою модель:
class Enfermos(models.Model):
TIPO_ANIMAL = [
('terneros', 'Terneros'),
('terneras', 'Terneras'),
('vaquillas', 'Vaquillas'),
('toros', 'Toros'),
('vacas_viejas', 'Vacas Viejas'),
]
tipo = models.CharField(choices=TIPO_ANIMAL, max_length=20)
potrero = models.ForeignKey('campo.Potrero', on_delete=models.DO_NOTHING)
enfermedad = models.ForeignKey('Enfermedad', on_delete=models.DO_NOTHING)
fecha = models.DateTimeField(default=timezone.now)
descripcion = models.CharField(null=True, blank=True, max_length=80, help_text='Si considera necesario agregar alguna descripción del animal enfermo aquí lo puede hacer. De lo contrario dejar vacio.')
ESTADO = [
('curado', 'curado'),
('muerto', 'muerto'),
('enfermo', 'enfermo'),
]
estado = models.CharField(choices=ESTADO, max_length=10, default='enfermo')
def __str__(self):
return 'Un ' + self.tipo + ' con: ' + self.enfermedad.nombre_enfermedad
Значительная часть моего шаблона:
<div class="container" style="min-height: 100%;height: 100%;">
<div class="row justify-content-center">
<div class="col-10">
<div class="py-3">
<h2>Panel de gestion de animales enfermos</h2></div>
{% for e in enfermos %}
<div class="row" style="border: double; margin-bottom: 20px; padding: 10px;">
<div class="col-8">
<h3>{{ e }}</h3>
<span id="enfermo_{{ e.id }}" style="display: none;">{{ e.id }}</span>
</div>
<div class="col-2">
<button data-enfermo-id="{{ e.id }}" type="button" class="btn btn-primary c_curo">Curado</button>
</div>
<div class="col-2">
<button data-enfermo-id="{{ e.id }}" type="button" class="btn btn-danger c_murio">Muerto</button>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{# aca viene magia de jquery, necesaria porque django no tiene frontend :( #}
<script>
$(".c_curo").on("click", function (e) {
e.preventDefault();
var url = "{% url 'animal:curar-enfermo' %}";
var e_id = '#enfermo_'+$(this).attr('data-enfermo-id');
var enfermo_id = $(e_id).text();
console.log(enfermo_id);
$.ajax({
url: url,
data: {
'enfermo': enfermo_id
},
success: function (data) {
console.log(data)
}
});
});
</script>
Вид:
def curarEnfermo(request):
enfermo_id = request.GET.get('enfermo')
enfermo = Enfermos.objects.get(id=enfermo_id)
enfermo.estado = 'curado'
enfermo.fecha = timezone.now
enfermo.save()
return JsonResponse({'success': 'true'})
И связанный URL:
path('ajax/enfermedad/curar', views.curarEnfermo, name='curar-enfermo'),
Если я запускаю его в режиме отладчика, кажется, что все работает безупречно, вплоть до точки сохранения. Экземпляр модели извлекается, и поля редактируются, но при выполнении инструкции enfermo.save()
(в представлении) возникает внутренняя ошибка сервера, которая сообщает:
Ошибка типа в / ajax / enfermedad / curar ожидаемая строка или байты
объект