Как передать ответ формы 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 %}

Я откровенно не могу найти способ реализовать эту функциональность. Заранее спасибо!

В существующем подходе вы можете создать еще одно представление и переопределить процесс в этой функции, а затем перенаправить на главную страницу.

Шаги реализации:

  1. создайте другое представление, скажем, override_record, и обработайте подтверждение в этой функции.

  2. после этого перенаправьте на страницу записи.

Код примера 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>
Вернуться на верх