Предложения по улучшению представления формы
Я создаю приложение, в котором пользователь вводит данные, а затем перенаправляется на страницу, которая показывает результаты, основанные на их вводе с помощью некоторых простых уравнений. Однако каждый раз, когда я обновляю страницу результатов, в базе данных сохраняется новый экземпляр модели.
Есть ли другой (более эффективный и действенный) способ передачи данных из этого представления в другое представление, где у меня есть доступ к экземпляру модели, отправленной через представление формы? Каков способ передачи данных формы в представление в Django?
Единственное ограничение - я не хочу аутентификации пользователя, поэтому использование self.request.user не подходит, если только это не может быть реализовано таким образом, чтобы не требовать от пользователей регистрации и входа.
Я все еще немного новичок в Django, поэтому любые указания на очевидные решения, которые я упускаю из виду, были бы очень признательны.
Это представление, которое обрабатывает форму модели:
def createcalculation(request):
form = CalcForm()
if request.method == 'POST':
form = CalcForm(request.POST)
if form.is_valid():
item = form.save()
m_data = get_object_or_404(Calculate, id=item.id)
context = {'c_data': form.cleaned_data, 'm_data': m_data}
return render(request, 'calc/res_ca.html', context)
context = {'c_form': form}
return render(request, 'calc/calc.html', context)
Рекомендуется всегда делать перенаправление после успешного POST. Ваш код должен выглядеть примерно так:
from django.shortcuts import get_object_or_404, render, redirect
from django.urls import reverse
...
def createcalculation(request):
form = CalcForm()
if request.method == 'POST':
form = CalcForm(request.POST)
if form.is_valid():
item = form.save()
m_data = get_object_or_404(Calculate, id=item.id)
context = {
'c_data': form.cleaned_data,
'm_data': m_data
}
return redirect(reverse('app_name:view_name', kwargs=context))
context = {'c_form': form}
return render(request, 'calc/calc.html', context)
Вы можете передать только что созданный объект item
также в контексте. Также следует изменить текст app_name
и view_name
в соответствии с вашей ситуацией.