Django Admin Actions — действия с промежуточной страницей

Панель администратора Django позволяет создавать дополнительные экшены, на примере дефолтного: удлалить несколько объектов. В данной заметке, я сохранил рецепт как создать экшен для изменения категории с промежуточной страницей.

И так, что должны получить.

Для порядка в коде вынесем форму в отдельный файл forms.py

_selected_action — Тут будут ID выбранных элементов. Django заберет их потом из POST запроса и сделает из них Queryset для которого мы будем делать наши действия.

forms.py
# -*- coding: utf-8 -*-

from django import forms
from django.utils.encoding import force_text

from nodes.models import Category

class ChangeCategoryForm(forms.Form):
    _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) 
    category = forms.ModelChoiceField(queryset=Category.objects.all(), label=u'Основная категория')

 

Пишем метод экшена и обьявляем его в необходимом нам классе

admin.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from nodes.forms import ChangeCategoryForm

def move_to_category(modeladmin, request, queryset):
   form = None

   if 'apply' in request.POST:
	   form = ChangeCategoryForm(request.POST)

	   if form.is_valid():
		   category = form.cleaned_data['category']

		   count = 0
		   for item in queryset:
			   item.category = category
			   item.save()
			   count += 1

		   modeladmin.message_user(request, "Категория %s применена к %d устройствам." % (category, count))
		   return HttpResponseRedirect(request.get_full_path())

   if not form:
	   form = ChangeCategoryForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})

   return render(request, 'nodes/move_to_category.html', {'items': queryset,'form': form, 'title':u'Изменение категории'}) 

move_to_category.short_description = u"Изменить категорию"

class NodeAdmin(admin.ModelAdmin):
	# ...
	actions = [move_to_category,]

Создаем шаблон для рендеренга

move_to_category.html
{% extends "admin/base_site.html" %}

{% block content %}
<form action="" method="post">{% csrf_token %}
    {{ form }}
    <p>Новая категория будет назначена для следующих позиций:</p>
    <ul>{{ items|unordered_list }}</ul>
    <input type="hidden" name="action" value="move_to_category" />
    <input type="submit" name="apply" value="Сохранить" />
</form>
{% endblock %}

 

Данная заметка конспект статьи на хабре.

Так же для окунания в тему:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *