Джанго: Как различать почтовые запросы с разных страниц, которые приходят на одну и ту же страницу?

У меня есть две страницы, содержащие form. Однако обе страницы отправляют почтовый запрос на одну и ту же страницу. Как отличить, какая страница отправила запрос.

dummy.html (первая страница)

<form action="/nda" method='POST'>
        {% csrf_token %}
        <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>

        <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
</form>

Эта страница перенаправляет на страницу nda.

nda.html (вторая страница)

Эта страница также перенаправляет на ту же страницу.

<form action="/nda"  method='POST'>
        {% csrf_token %}
    <button type="submit" name="submit" id="submit" value="I Agree" target="_self">I Agree</button>
    <button onclick="window.open('/greeting')" target="_self"> I Disagree </button></br>
</form>

Мой вопрос в том, как мне отличить, на мой взгляд, то, с какой страницы он исходил от фиктивной страницы или той же страницы, которая была nda.

views.py

def nda(request):
    if request.method=='POST' :
        # if this is from dummy I want to do this
        return render(request,'mainapp/nda.html',{'user':email.split('@')[0]})

    if request.method=='POST' :
        # if this is from same page that is nda I want to do this
        return render(request,'mainapp/home.html')

Я не могу понять, как мне обрабатывать оба случая по-разному


person Himanshu Poddar    schedule 28.10.2019    source источник
comment
Почему бы им не перейти к двум разным точкам зрения?   -  person Kent Shikama    schedule 28.10.2019
comment
в таком случае я бы не задавал этот вопрос   -  person Himanshu Poddar    schedule 28.10.2019
comment
(1) Если вы пишете оба конца своего приложения, почему бы вам не использовать нормальный параметр, например... page_origin? (2) Возможно, вы думали о views.py как об общем коде для обоих, и только что наткнулись на первый контрпример, так что, возможно, конструкция неверна...? (похоже, вам придется провести рефакторинг в ближайшем будущем, вы могли бы сделать это сейчас и с самого начала). Как уже предложил Кент. Вы, кажется, слишком уверены в своем дизайне, это распространенная ошибка. Отсутствие дублирования некоторого кода в этом случае может быть дорогостоящим. Подумайте еще раз.   -  person MikeMajara    schedule 28.10.2019
comment
@HimanshuPoddar Извиняюсь, если это было глупое предложение, но для меня это похоже на случай XY проблема. Почему вы не можете сделать так, чтобы они работали в двух режимах? Например, пытаетесь ли вы не дублировать код в своем представлении?   -  person Kent Shikama    schedule 28.10.2019
comment
@KentShikama, так как оба перенаправляют на одну и ту же страницу, как мне создать для них отдельные представления   -  person Himanshu Poddar    schedule 28.10.2019
comment
Используя action=/nda в обоих случаях, вы заставляете их выполнять POST по одному и тому же URL-адресу, и, таким образом, они направляются к одному и тому же представлению.   -  person Kent Shikama    schedule 28.10.2019
comment
Обычно вы просто оставляете action= (пустым), чтобы они выполняли POST по URL-адресу, с которого изначально была получена страница, который будет разным для обеих страниц.   -  person Kent Shikama    schedule 28.10.2019


Ответы (2)


Если я правильно понял ваш вопрос, вы можете использовать атрибут имени в кнопке отправки.

<button type="submit" name="submit1" id="submit" value="I Agree"  target="_blank">I Agree</button

<button type="submit" name="submit2" id="submit" value="I Agree"  target="_blank">I Agree</button

И во взглядах

def nda(request):
    if request.method=='POST' and 'submit1' in request.POST :
        # do something
        return render(request,'mainapp/nda.html',{'user':email.split('@')[0]})

    elif request.method=='POST' and 'submit2' in request.POST:
        #do something else
        ...
person Arjun    schedule 28.10.2019

Как это работает ? Вы нажимаете на кнопку отправки и сервер обращается.. Кнопка с типом отправки следует по пути «действия», указанному в теге формы. То есть, чтобы у вас был запрос на разные страницы, вам нужно создать дополнительный url, просмотры и html

Пример:

one_html.html

<form action="{% url your_app:name1 %}" method='POST'>
        {% csrf_token %}
        <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>

        <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
</form>

URL.py:

...
url(r'^' + app_name + 'some_path', views_one, name='name1'),

просмотров.py:

def views_one(request):
    if request.method=='POST':
        # do something

Пример:

two_html.html

<form action="{% url your_app:name2 %}" method='POST'>
        {% csrf_token %}
        <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>

        <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
</form>

URL.py:

...
url(r'^' + app_name + 'some_path', views_two, name='name2'),

просмотров.py:

def views_two(request):
    if request.method=='POST':
        # do something

Разница в том, что действие указывает на другой URL-адрес и, следовательно, будет называться разными представлениями.

person Maxocoder    schedule 28.10.2019
comment
Вы знаете, что вам могут запретить отвечать дальше 1. Это неправильный ответ 2. Неверное форматирование 3. Этот ответ, даже если он правильный, не для Django 2+ - person Himanshu Poddar; 28.10.2019
comment
Извините, я не правильно отформатировал текст, так что ничего не понятно - person Maxocoder; 28.10.2019