Как я могу отправить данные на промежуточную страницу при использовании пользовательского действия django?
Я хочу добавить пользовательское действие django, которое позволяет изменить поле выбора для моей модели.
Мне нужна промежуточная страница, на которой пользователь может задать новое значение для этого поля. Это поле должно быть на другом URL.
Проблема в том, что мне нужно каким-то образом отправить выбранные идентификаторы на эту промежуточную страницу, а получить параметры - это не вариант, потому что количество идентификаторов может быть слишком большим, а у меня есть проектное ограничение на длину URL-адреса - строго менее 8000 символов.
Прямо сейчас у меня есть эта настройка, и она отлично работает, но я понятия не имею, как я могу отправить идентификаторы выбранных объектов без getParams.
forms.py
class MyModelChangeStepForm(Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
step_code = forms.ChoiceField(choices=...)
admin.py
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
actions = ('change_mymodel_step',)
@admin.action(description='')
def change_mymodel_step(self, request, queryset):
selected_mymodel_ids = list(queryset.values_list('id', flat=True))
mymodels_count = len(selected_mymodel_ids)
if 'apply' in request.POST:
form = MyModelChangeStepForm(request.POST)
if form.is_valid():
new_step_code = form.cleaned_data['step_code']
# use `filter` instead of `queryset` to prevent FieldError because queryset has annotations
MyModel.objects.filter(pk__in=selected_mymodel_ids).update(step_code=new_step_code)
for mymodel in queryset:
self.log_change(request, mymodel, '...')
self.message_user(request, '...')
return None
self.message_user(
request,
'...',
level=messages.ERROR,
)
return None
form = MyModelChangeStepForm(initial={
'_selected_action': selected_mymodel_ids,
'action': request.POST['action'],
})
return render(
request,
'mymodel_change_step_code.html',
{'form': form, 'objects': queryset, 'mymodels_count': mymodels_count},
)
mymodel_change_step_code.html
{% extends "admin/base_site.html" %}
{% block content %}
<div id="content" class="colM">
<h1>Title</h1>
<form action="" method="post">{% csrf_token %}
{{ form }}
<h2>Stats</h2>
<ul><li>Total: {{ mymodels_count }}</li></ul>
<h2>Objects:</h2>
<ul>{{ objects|unordered_list }}</ul>
<input type="hidden" name="action" value="change_mymodel_step">
<input type="submit" name="apply" value="Apply" class="button">
<a href="{{ request.META.HTTP_REFERER }}">Cancel</a>
</form>
</div>
{% endblock %}
Я слышал, что могу отправить эти данные с помощью request.session
, но я не уверен, что это правильный способ. Я новичок в python и django, поэтому не знаю никаких хороших практик для этого.