Django: Доступ к контекстным данным в POST и GET
Я очень новичок в Django и не могу понять, как получить доступ к контекстным данным в POST-запросе, чтобы не повторяться.
Я считаю, что POST выполняется до get_context_data, но опять же не уверен, что именно здесь нужно делать.
На странице отображаются некоторые данные с использованием значения по умолчанию 30 дней. Затем на странице есть форма для переопределения этого значения, которое передается обратно в метод POST для повторного отображения страницы.
Пример страницы.
views.py
model = Producer
template_name = 'producer_detail3.html'
def get_queryset(self, **kwargs):
#-date_check means to descending order based on that column
return Producer.objects.filter(owner_name__exact=self.kwargs['pk'],metasnapshot_date=date(1980, 1, 1))
# Update context with more information
def get_context_data(self, **kwargs):
# Call the base implementation first to get the context
context = super().get_context_data(**kwargs)
# Cannot update context here as you are accessing existing producer object context data.
# Create any data and add it to the context
how_many_days = self.kwargs['days'] # get DAYS from URL. KWARGS are passed in from the get request
context['day_filter'] = reverse('results:producer_detail', args=[self.kwargs['pk'], '300'])
context['results'] = Results.objects.all().filter(owner_name__exact=self.kwargs['pk']).order_by('-date_check')
context['chains_json_count'] = Results.objects.filter(owner_name__exact=self.kwargs['pk'],chains_json=True,date_check__gte=datetime.now()-timedelta(days=how_many_days)).count()
return context
def post(self, request, **kwargs):
day_filter = int(request.POST.get('day_filter'))
producer = Producer.objects.get(owner_name__exact=kwargs['pk'],metasnapshot_date=date(1980, 1, 1))
# Using reverse we create a URL to set the day filter to 300 and create a link
results = Results.objects.all().filter(owner_name__exact=kwargs['pk']).order_by('-date_check')
chains_json_count = Results.objects.filter(owner_name__exact=kwargs['pk'],chains_json=True,date_check__gte=datetime.now()-timedelta(days=day_filter)).count()
context = {
'producer': producer,
'results': results,
'chains_json_count': chains_json_count,
'day_filter_url': day_filter
}
return render(request, 'producer_detail3.html', context)
producer_detail3.html
<h1>{{ producer.owner_name }}</h1>
<div class="row">
<div class="col-md-8">
<img src="{{ producer.logo_svg }}" alt="" width="100%">
</div>
<div class="col-md-4">
<h5>Producer:owner_name{{ producer.owner_name }}</h5>
<h5>Producer.pk: {{ producer.pk }}</h5>
<!--a href="{{ day_filter_url }}"
class="btn btn-primary">
Set day filter to 300
</a>
<h5>{{ producer.url }}</h5-->
<form method="post">
<p><label for="day_filter">Set day filter value</label>
{% csrf_token %}
<input type="text" name="day_filter" size="40" id="day_filter"/></p>
<input type="submit"/>
</form>
<br>
<h5>Results: {{ chains_json_count }}</h5>
<table>
<tr>
<th>HTTP</th>
<th>Hyperion</th>
<th>Date</th>
</tr>
{% for result in results %}
<tr>
<td>{{result.http_check}}</td>
<td>{{result.hyperion_v2}}</td>
<td>{{result.date_check}}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
здесь нет "скрытого" вызова get_context_data - вам нужно заполнить контекст, вызвав метод из вашего метода post(), как
def post (....):
# Get the context
context = self.get_context_data(**kwargs)
при необходимости добавьте дополнительные элементы к контексту в post() после этого.
