Не удалось получить значение из html-страницы в Django

I have a problem with trying to get a response from my HTML page using Django (admin). I have a pretty simple div = contenteditable and need to pass data from this div back after the submit button was clicked.

Everything, including choosing selection and opening the intermediate page works fine. But when I tapped submit button, the condition if "apply" in request.POST failed to work.

Пожалуйста, скажите мне, что я делаю неправильно?

Это моя админка Django:

class QuestionAdmin(AnnotatesDisplayAdminMixin, admin.ModelAdmin):

def matched_skills(self, question):
    return ', '.join(s.name for s in question.skills.all())

def update_skills(self, request, queryset):
    if 'apply' in request.POST:
        print("something")
        
    skills = []
    for question in queryset:
        skills.append(self.matched_skills(question))
    return render(request,
                  'admin/order_intermediate.html',
                  context={'skills': skills})

update_skills.short_description = "Update skills"

Это моя страница order_intermediate.html:

{% extends "admin/base_site.html" %}
{% block content %}
<form method="post">
    {% csrf_token %}

  <h1>Adjust skills. </h1>
  {% for skill in skills %}
    <div>
    <div id="title" style="margin-left: 5px" contenteditable="true" > {{ skill }} </div>
    </div>
  {% endfor %}

  <input type="hidden" name="action" value="update_status" />
  <input type="submit" name="apply" value="Update skills"/>
</form>
{% endblock %}

На самом деле request.POST - это объект HttpRequest. Для получения доступных ключей в теле запроса необходимо использовать метод "request.POST.keys()". Поэтому вы можете просто изменить условие на:

if 'apply' in request.POST.keys():
    print("something")

Насколько мне известно, вы не можете передавать содержимое div с помощью формы submit. Однако вы можете использовать для этого тег input с массивом в атрибуте name. Это отправит массив в качестве переменной post при submit

Сначала отправьте навыки как объект перечисления из ваших представлений

return render(request, 'admin/order_intermediate.html', context={'skills': enumerate(skills)})

Затем отредактируйте ваш html следующим образом (Примечание: если у вас есть css в title id, измените его на title class)

{% for i,skill in skills %}
    <div>
        <input class="title" name="skill[{{ i }}]" value="{{ skill }}" style="margin-left: 5px">
    </div>
{% endfor %}

и обработать массив с любым действием, которое вы хотите выполнить в update_skills()

for skill in request.POST.getlist('skill[]'):
    # your code

Надеюсь, это поможет

Вернуться на верх