Django UpdateView не сохраняет изменения в БД
В моем приложении я пытаюсь обновить объект с помощью Class Based View UpdateView и сохранить его в базе данных. Вот мой код:
models.py:
class Toy(models.Model):
#Relation
list = models.ForeignKey(GiftingList, on_delete=models.DO_NOTHING)
donor = models.ForeignKey("auth.User", on_delete=models.DO_NOTHING)
#Attribute
name = models.CharField(max_length=30, blank=False, help_text="Spielzeugnamen eingeben")
description = models.TextField(max_length=200, blank=False, default="", help_text="Spielzeug eingeben")
image = models.ImageField(upload_to="upload/images/", blank=False, help_text="Bild hochladen")
def __str__(self):
return self.name
urls.py:
app_name = 'toys'
urlpatterns = [
...
path("toys/<int:pk>/update/", ToyUpdateView.as_view(), name="ToyUpdate"),
...
]
views.py:
class FormSubmittedInContextMixin(FormMixin):
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form, form_submitted=True))
class ToyUpdateView(UpdateView, FormSubmittedInContextMixin):
model = Toy
form_class = ToyForm
template_name = "main/updatetoy.html"
success_url = reverse_lazy('toys:GiftingListOverview')
forms.py:
class ToyForm(forms.ModelForm):
class Meta:
model = Toy
widgets = {
#'list': forms.ModelChoiceField(queryset=GiftingList.objects.label(), required=True),
'list': forms.TextInput(attrs={'class': 'form-control'}),
'donor': forms.TextInput(attrs={'class': 'form-control'}),
'name': forms.TextInput(attrs={'class': 'form-control'}),
'description': forms.TextInput(attrs={'class': 'form-control'}),
'image': forms.TextInput(attrs={'class': 'form-control'}),
}
fields = ('list', 'donor', 'name', 'description', 'image')
HTML Шаблон:
{% extends "main/base.html" %}
{% block title %}Spielzeug bearbeiten{% endblock %}
{% block content %}
<div class="container">
<h3>Spielzeug {{ toy.name }} bearbeiten</h3>
<form action="{% url 'toys:ToyUpdate' toy.id %}" method="post" enctype='multipart/form-data'>
{% csrf_token %}
{% include 'main/toy_form.html' %}
<a href="{% url 'toys:ToyDetail' toy.id %}" class="btn btn-primary">Zurück<a>
<button type="submit" class="btn btn-success">Speichern</button>
</form>
</div>
{% endblock %}
toy_form.html:
<section class="django-forms">
<div class="form-group">
<b>Liste:</b>
{{ form.list }}
<div class="invalid-feedback">
{{ form.label.errors }}
</div>
</div>
<div class="form-group">
<b>Author:</b>
{{ form.donor }}
<div class="invalid-feedback">
{{ form.user.errors }}
</div>
</div>
<div class="form-group">
<b>Name:</b>
{{ form.name }}
<div class="invalid-feedback">
{{ form.details.errors }}
</div>
</div>
<div class="form-group">
<b>Beschreibung:</b>
{{ form.description }}
<div class="invalid-feedback">
{{ form.label.errors }}
</div>
</div>
<div class="form-group">
<b>Image:</b>
{{ form.image }}
<div class="invalid-feedback">
{{ form.label.errors }}
</div>
</div>
</section>
Когда я меняю заголовок в форме, он тут же меняет и заголовок тега, но не перенаправляет меня, что он должен делать, если валидация прошла успешно. Также, когда я вручную возвращаюсь к обзору, изменения не сохраняются.
У меня есть другой класс, в котором этот сценарий работает, как ожидалось. Я не могу понять, почему он не работает с этим классом.
Терминал не показывает ошибку. HTML-код равен 200. Когда я обновляю и сохраняю этот другой функционирующий класс, он показывает код 302. Есть ли у вас какие-нибудь идеи?
Проблема была в виджете 'image' в forms.py. Я просто удалил его и позволил наследоваться от класса. Теперь можно сохранять изменения.