Как передать ответ формы Django через другой шаблон
Я создаю сайт, на котором пользователи могут записывать вес своих цыплят, и пытаюсь разработать форму подтверждения, если пользователь пытается отправить другой вес для того же цыпленка в тот же день. Другими словами, если запись уже существует для этой даты, как спросить пользователя, следует ли ее перезаписать, не вводя вес заново. Это все, что у меня есть на данный момент:
# views.py
def add_record(request, chicken) -> HttpResponseRedirect | HttpResponsePermanentRedirect | HttpResponse:
"""
View for the "record_weight.html"
Post & Get methods
"""
if request.method == "POST":
form = RecordForm(request.POST)
if form.is_valid():
record = form.save(commit=False)
record.chicken = Chicken.objects.filter(number=chicken).first()
record.date = datetime.now().date()
try:
Record.save(record)
except ValidationError:
# There is a record for that day, render another form asking if they want to overwrite
return render(request, "tags/duplicate_record.html", {"bird": record.chicken})
return redirect("/admin/tags/record/")
form = RecordForm()
try:
birds = Chicken.objects.all()
req_bird = birds.filter(number=chicken).first()
except Chicken.DoesNotExist:
raise Http404("Bird does not exist")
try:
req_records = Record.objects.filter(chicken_id=chicken).order_by("date").reverse()
except Record.DoesNotExist:
req_records = []
return render(request, "tags/record_weight.html", {"bird": req_bird, "records": req_records, "form": form, "nav_filter": get_birds_navbar(birds)})
# duplicate_records.html (styling removed for easier reading)
{% extends "tags/layout.html" %}
{% block content %}
<div>
<div>
<h2>There is already a weight for today!</h2>
<p>Do you want to overwrite that entry</p>
<form>
<a href="/records/{{ bird.number }}">No</a>
<button>Overwrite</button>
</form>
</div>
</div>
{% endblock %}
Я откровенно не могу найти способ реализовать эту функциональность. Заранее спасибо!
В существующем подходе вы можете создать еще одно представление и переопределить процесс в этой функции, а затем перенаправить на главную страницу.
Шаги реализации:
создайте другое представление, скажем, override_record, и обработайте подтверждение в этой функции.
после этого перенаправьте на страницу записи.
Код примера in views.py
def override_record(request, chicken):
if request.method == "POST":
# your override code
pass
return redirect("/admin/tags/record/")
в duplicate_records.htm
{% extends 'tags/layout.html' %}
{% block content %}
<div>
<div>
<h2>There is already a weight for today!</h2>
<p>Do you want to overwrite that entry</p>
<form action="{% url 'override_record' %}">
<a href="/records/{{ bird.number }}">No</a>
<button>Overwrite</button>
</form>
</div>
</div>
{% endblock %}
Лучшим подходом было бы показать всплывающее окно подтверждения пользователю на той же странице, а после подтверждения пользователя обработать запрос на переопределение.
Если вы хотите сделать это без перенаправления в другое представление, вы можете использовать ошибки формы, чтобы проверить пользователя, нужно ли ему перезаписывать данные, и разные названия кнопок шаблона для подтверждения выбора. Это упрощенный вид (без валидаций и т.д.):
def add_record(request):
context = {}
if request.method == 'POST':
form = RecordForm(request.POST)
overwrite = True if 'do_overwrite' in request.POST else False
keep = True if 'keep' in request.POST else False
date = form.data['date']
if Record.objects.filter(date=date):
if overwrite:
# Overwrite the record as you see fit
pass
elif keep:
# Redirect to somewhere else
pass
else:
form.add_error('date', 'Do you want to overwrite that entry?')
context['ask_overwrite'] = True
else:
# Save the record
pass
else:
form = RecordForm()
context['form'] = form
return render(request, 'tags/record_weight.html', context=context)
А это шаблон с разными кнопками:
<form method="post">
{% csrf_token %}
{{form.date}}
{% if form.date.errors %}
<ul>
{% for error in form.date.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
{% if ask_overwrite %}
<button type="submit" name="do_overwrite">Overwrite</button>
<button type="submit" name="keep">No</button>
{% else %}
<button type="submit">Submit</button>
{% endif %}
</form>