Лучший способ обновить несколько шаблонов на основе отправки формы?
Я работаю над проектом, который выполняет несколько вычислений на основе пользовательского ввода, и сейчас я пытаюсь создать новую форму в шаблоне variables_input, где пользователь может получить значения, использованные в предыдущих запусках, и это работает на шаблоне variables_input, в результате чего значения отображаются на странице. Однако, когда пользователь переходит на другую страницу, отображаются значения последних вычислений. Как сделать так, чтобы, когда пользователь выбирает прошлый прогон, ему не нужно было запускать расчеты, а просто получить значения из соответствующих моделей для отображения на соответствующей странице? Мне интересно, смогут ли сигналы достичь желаемого результата или возможно более простое решение. Ниже приведен пример кода моего проекта.
variables_input.html
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" , value="Submit" name="prior_run">
</form>
<form action="" method="post">
<h2>Variables Table One</h2>
{% csrf_token %}
<!-- Table Columns -->
<table>
<table class="vartable" style="text-align: center;">
<colgroup>
<col class="grey">
</colgroup>
<thead>
<tr>
<th>Variable 1</th>
<th>Variable 2</th>
<th>Variable 3</th>
<th>Variable 4</th>
<th>Run Name</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<div>
<td><input type="text" value="{{inputs_list.0}}" name="var_one"></td>
<td><input type="text" value="{{inputs_list.1}}" name="var_two"></td>
<td><input type="text" value="{{inputs_list.2}}" name="var_three"></td>
<td><input type="text" value="{{inputs_list.3}}" name="var_four"></td>
<td><input id="run_name" type="text" value="{{inputs_list.5}}" name="run_name"></td>
</div>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</table>
forms.py
class InputsForm(forms.Form):
past_run_names = [
(i["run_name"], i["run_name"])
for i in InputVariables.objects.values("run_name")
]
run_name = forms.ChoiceField(choices=past_run_names)
views.py
class VariableInputView(FormView, View, LoginRequiredMixin):
template_name = "variable_input.html"
input_model = InputVariables
inputs_form_class = InputsForm
def get(self, request):
# perform get method
def post(self, request):
post_data = request.POST.dict()
if "prior_run" in request.POST:
form = self.inputs_form_class(request.POST)
if form.is_valid():
inputs_query = self.input_model.objects.filter(
run_name=run_name
).values_list(*first_assumptions_list)
inputs_list = list(inputs_query[0])
return HttpResponseRedirect(self.request.path_info)
return render(
request,
self.template_name,
{
"inputs_list": inputs_list,
"form": form,
},
)
else:
# run the calculation
class BasicTableView(View, LoginRequiredMixin):
model = None
template_name = None
def get(self, request):
"""
Get the latest entry in the database when the last time the table was
generated.
"""
if not request.user.is_authenticated:
return redirect("/accounts/login")
else:
input_var_query = InputVariables.objects.values_list(
"var_one",
"var_two",
"var_three",
"var_four",
"run_name",
).latest("time_stamp")
input_var_list = list(input_var_query)
data = (
self.model.objects.filter(
input_variables__var_one=input_var_list[0],
input_variables__var_two=input_var_list[1],
input_variables__var_three=input_var_list[2],
input_variables__var_four=input_var_list[3],
input_variables__run_name=input_var_list[4],
)
.order_by("time_stamp")
.reverse()[: self.end_slice : -1]
)
print(data)
except InputVariables.DoesNotExist:
...
return render(
request,
self.template_name,
{"data": data, "input_var_list": input_var_list},
)
class SummaryOfResultsView(BasicTableView):
model = SummaryOfResults
template_name = "summary_of_results.html"
models.py
class SummaryOfResults(models.Model):
result_one = models.TextField()
result_two = models.TextField()
result_three = models.TextField()
input_variables = models.ForeignKey(InputVariables, on_delete=models.CASCADE)
time_stamp = models.DateTimeField(auto_now_add=True, blank=True)
class InputVariables(models.Model):
var_one = models.TextField()
var_two = models.TextField()
var_three = models.TextField()
var_four = models.TextField()
run_name = models.TextField()
time_stamp = models.DateTimeField(auto_now=True, null=True)
def __str__(self):
# return strings
results.html
Пробовали ли вы использовать теги шаблонов?
вы пишете его один раз, но можете использовать его везде в шаблонах.
Я приведу вам пример:
register = template.Library()
@register.simple_tag(name='get_live_jobs')
def get_live_jobs():
live_jobs = Job.objects.all().exclude(
Q(is_deleted=True) | Q(last_date__lt=datetime.date.today()) | Q(is_archived=True)).count()
return live_jobs
Тогда в своем шаблоне вы сделаете:
{% load get_general_counters %}
{% get_live_jobs %}