Не удалось получить значение из 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
Надеюсь, это поможет