Как я могу вызвать представление внутри другого представления django
В настоящее время у меня есть представление, которое по сути закрывает лид, то есть просто копирует информацию из одной таблицы (лиды) в другую (сделки), теперь я хотел бы сделать так, чтобы после нажатия кнопки закрыть, пользователь перенаправлялся на другую страницу, где он может обновить некоторые записи (прогноз продаж), у меня есть представление, которое обновляет лид, поэтому я подумал, что могу сделать что-то вроде следующего:
@login_required
def close_lead(request):
id = request.GET.get('project_id', '')
keys = Leads.objects.select_related().get(project_id=id)
form_dict = {'project_id': keys.project_id,
'agent': keys.agent,
'client': keys.point_of_contact,
'company': keys.company,
'service': keys.services,
'licenses': keys.expected_licenses,
'country_d': keys.country
}
deal_form = NewDealForm(request.POST or None,initial=form_dict)
if request.method == 'POST':
if deal_form.is_valid():
deal_form.save()
obj = Leads.objects.get(project_id=id)
obj.status = "Closed"
obj.save(update_fields=['status'])
## Changing the Forecast Table Entry
forecast = LeadEntry.objects.filter(lead_id=id)
for i in forecast:
m = i
m.stage = "Deal"
m.save(update_fields=['stage'])
messages.success(request, 'You have successfully updated the status from open to Close')
update_forecast(request,id)
else:
messages.error(request, 'Error updating your Form')
return render(request,
"account/close_lead.html",
{'form': deal_form})
Это представление предоставляет набор форм, который я хочу обновить после закрытия лида
@login_required
def update_forecast(request,lead_id):
# Gets the lead queryset
lead = get_object_or_404(Leads,pk=lead_id)
#Create an inline formset using Leads the parent model and LeadEntry the child model
FormSet = inlineformset_factory(Leads,LeadEntry,form=LeadUpdateForm,extra=0)
if request.method == "POST":
formset = FormSet(request.POST,instance=lead)
if formset.is_valid():
formset.save()
return redirect('forecast_lead_update',lead_id=lead.project_id)
else:
formset = FormSet(instance=lead)
context = {
'formset':formset
}
return render(request,"account/leadentry_update.html",context)
Как вы видите, я вызываю функцию update_forecast(request,id) после валидации данных в форме, и я ожидал, что буду каким-то образом перенаправлен на HTML страницу, указанную в этой функции, однако, после нажатия кнопки submit, форма из первого представления валидируется, но затем ничего не происходит, так что функция не выводит HTML страницу
Мой вопрос, как я могу использовать существующие функции в моих представлениях?, очевидно, я представляю, что следуя принципам DRY, вы можете сделать это в Django, так что же я делаю не так?, как я могу вызвать существующую функцию внутри другой функции в представлениях?
Представление возвращает объект ответа. В вашем текущем коде вы вызываете второе представление, но ничего не делаете с его ответом. Если бы вы просто хотели отобразить статическое содержимое (не форму, которая может привести к действию, которому важен текущий URL), вы могли бы вернуть объект ответа из второго представления - return update_forecast(request, id)
.
Но поскольку ваше второе представление отображает форму, вам важно, каким будет действие для представления из второй формы. Типичная идиома Django заключается в том, что формы отправляются на URL текущей страницы - это не будет работать, если вы просто вызовете форму и вернете ее объект ответа. Вы могли бы настроить действие во втором представлении, скажем, добавить необязательный параметр к представлению, но обычная идиома для обработки форм - это перенаправление на представление, которое вы хотите показать при успехе. Точно так же, как вы делаете это в представлении update_forecast
. Что-то вроде этого:
messages.success(request, 'You have successfully updated the status from open to Close')
return redirect('update_forecast', lead_id=id)