Django: Моя попытка обновить экземпляр вместо этого создает новый экземпляр
Я почти уверен, что я неправильно понимаю что-то очевидное, но я разобрал код до самых основ и по какой-то причине не могу найти проблему. Это действительно работало в предыдущей итерации (следуя советам из других сообщений S/O), но, очевидно, я что-то сломал при редактировании кода в какой-то момент.
Примечание: я удалил код, который кажется лишним для этой темы.
Ожидаемое поведение/с:
Если пользователь выбирает кнопку "Edit" на странице index.html, он попадает на страницу edit_booking.html, где форма CustomerForm заполняется выбранным экземпляром клиента. (Это похоже работает как ожидалось. Я думаю, что, возможно, это ошибка в моей ментальной модели, но я не уверен, что именно.)
Если пользователь нажимает кнопку "Сохранить" на странице edit_booking.html, выбранный экземпляр Customer обновляется/заменяется тем, что пользователь ввел (или уже ввел) в форму. (Это работает не так, как ожидалось. Вместо этого, когда пользователь выбирает кнопку "Сохранить", создается новый экземпляр Customer из содержимого формы edit_booking.html.)
Что я пробовал:
- Я заменил передачу переменной customer в views.edit_customer (и edit_customer.html) на просто customer_id (т.е. "customer_id": customer_id), но это не помогло. То есть я не думал, что это будет работать, но я в растерянности!
- Я заменил "customer = form.save()" на "customer = form.save(commit=False) / customer.save()". Это не дало никакого видимого эффекта.
- Я удалил "customer = form.save()" и отредактировал поля по отдельности (например, "customer.first_name = 'Buster'", затем "customer.save()"). Это работает, казалось бы, идеально. Но это кажется слишком сложным; как я уже говорил, я уверен, что существует более простой способ обновления экземпляров, который работал раньше. Возможно, я неправильно помню.
Сообщения об ошибках: N/A
Мои вопросы:
- Почему это не работает?
- Как я могу это исправить?
--
index.html
<form action="{% url 'edit_customer' customer_id=customer.id %}" method="post">
{% csrf_token %}
{{ customer }}
<input type="submit" name="query" value="Edit">
</form>
edit_customer.html
<form action="{% url 'edit_customer' customer_id=customer.id %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" name="query" value="Save">
</form>
urls.py
urlpatterns = [
path('edit_customer/<customer_id>', views.edit_customer, name="edit_customer"),
]
views.py
def edit_customer(request, customer_id):
if request.method == "POST":
customer = Customer.objects.get(pk=customer_id)
query = request.POST.get("query")
if query == "Edit":
return render(request, "appname/edit_customer.html", {
"customer": customer,
"form": CustomerForm(instance=customer)
})
if query == "Save":
form = CustomerForm(request.POST)
if form.is_valid():
customer = form.save()
return HttpResponseRedirect(reverse("index"))