В Django как узнать какая кнопка была нажата? - PullRequest
0 голосов
/ 04 марта 2020

Вот мой html, у меня есть две кнопки, одна для принятия, а другая для отклонения запроса. На мой взгляд, мне нужно знать, какая кнопка была нажата, а также адрес электронной почты заявителя (tutor_application.tutor.chalkslateuser.email). Я пробовал много решений, но безрезультатно.


{% for tutor_application in tutor_application_list %}

    <div class="card" style="width: 15rem;">
      <img src="{{ tutor_application.tutor.picture.url }}" class="card-img-top" >
      <div class="card-body">
        <h5 class="card-title">
            {{ tutor_application.tutor.chalkslate_user.first_name }} {{ tutor_application.tutor.chalkslate_user.last_name }}
        </h5>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.note }}</h6>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.posted }}</h6>
      </div>
      <a class="btn btn-outline-success" role="button" type="submit"> Accept </a>
      <a class="btn btn-outline-danger" href="#" role="button"> Reject </a>
    </div>

{% endfor %}

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Информация

Позволяет разделить слои, чтобы избежать путаницы. Существует 2 слоя: на стороне клиента и на стороне сервера

на стороне сервера

Django работает на стороне сервера, он выбирает данные из переменных что вы отправили на свою страницу все остальное, поэтому он, в общем, смонтирует одну HTML страницу и вернет ее вашему клиенту (в этом случае вам)

Клиентская сторона

Это страница, которая была возвращена django (или любым другим сервером или фреймворком), запущенным на клиентском браузере, а не на сервере, который называется DOM, и django не может манипулировать им, потому что он уже обработан, чтобы сделать это, вам нужно будет использовать Javascript, чтобы вы могли взаимодействовать с элементами со своей страницы, запускать события и видеть, были ли какие-либо данные изменены на стороне клиента, один простой способ использовать Javascript на клиенте сторона использует Jquery, потому что одна библиотека более дружественная

Вот ваш код с небольшим изменением, я добавил имена и идентификаторы в обе ваши ссылки, которые называются btnAccept и btnReject, и добавил <input type="hidden" id="btnType" name="btnType">

{% for tutor_application in tutor_application_list %}

    <div class="card" style="width: 15rem;">
      <img src="{{ tutor_application.tutor.picture.url }}" class="card-img-top" >
      <div class="card-body">
        <h5 class="card-title">
            {{ tutor_application.tutor.chalkslate_user.first_name }} {{ tutor_application.tutor.chalkslate_user.last_name }}
        </h5>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.note }}</h6>
        <h6 class="card-subtitle mb-2 text-muted">{{ tutor_application.posted }}</h6>
      </div>
      <input type="hidden" name="btnType">
      <a id="btnAccept" name="btnAccept" class="btn btn-outline-success" role="button" type="submit"> Accept </a>
      <a id=="btnReject" name="btnReject" class="btn btn-outline-danger" href="#" role="button"> Reject </a>
    </div>

{% endfor %}

Вот некоторые код с Jquery для манипулирования им впереди, если вы хотите сделать это на стороне клиента

window.addEventListener("DOMContentLoaded", function(){
    $("#btnAccept").click(function(){
        $("#btnType").val('accepted');
    });

    $("#btnReject").click(function(){
        $("#btnType").val('rejected');
    });
});

Так что в ваших данных поста просто проверьте значение из btnType и посмотрите, было ли принято или отклонено

Или просто добавьте имена тегов в свои входные данные (как я делал раньше), и вы можете получить их из данных вашего запроса ... вы должны изменить тег на и просто получить его в своем бэкэнде при нажатии на нем

РЕДАКТИРОВАТЬ

Все ваши данные из вашей формы будут в request.POST (если вы отправите его как POST), так что вы можете получить как request.POST['email'] (, что это немного грязно, потому что, если у вас нет электронной почты в POST, возникнет ошибка ), или лучший подход, request.POST.get('email', None), то попытайтесь получить атрибут с именем email, если не найдете, он просто вернет None (null), так что вы можете проверить его с помощью if или что-то в этом роде

О вашем объекте tutor_application, когда вы визуализируете свой шаблон с помощью tutor_application.tutor.chalkslateuser.email, который будет просто электронной почтой в виде строки, так что вы не удерживаете ссылка на объекты ш Если вы отправите его на веб-интерфейс, то, если вы хотите узнать, какой репетитор выбран, вам, возможно, придется добавить идентификатор или адрес электронной почты в качестве ввода в html, чтобы вы могли отправить его обратно на сервер и вычислить что такое репетитор

<input type="hidden" name="email" value="{{tutor_application.tutor.chalkslateuser.email}}">

И в вашем бэкэнде вы получите его как

email = request.POST.get('email', None')

Имейте в виду, чтобы поменять теги <a> на <input name="">, чтобы вы могли получить их в своем бэкэнд в качестве атрибутов в запросе.POST

0 голосов
/ 04 марта 2020

Используй Django Фреймворк форм! Абсолютно, определенно, делайте.

Однако нет причин не использовать две кнопки отправки для одной Django формы / страницы. У них есть имя и значение. Например,

<input type="submit name="update" value="Update" 
     class="btn btn-primary" id="submit-id-update" />

<input type="submit" name="done" value="Done" 
     class="btn btn-primary" id="submit-id-done" />

По вашему мнению, вы можете посмотреть в request.POST, чтобы увидеть, какая из них была нажата. Например,

if request.POST.get('done', None):
     # user pressed the Done button
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...