Найти - Пользователи
Полная версия: Изменение значения поля у нескольких объектов модели. Admin Actions
Начало » Django » Изменение значения поля у нескольких объектов модели. Admin Actions
1
shepelin
Здравствуйте. Столкнулся с такой задачей есть две модели Рубрикатор и Товар.

Задача сделать возможность изменения у одного или нескольких товаров изменять поле rubricator в админке Django


models.py
from mptt.models import MPTTModel
from django.db import models

class Rubricator(MPTTModel):
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
name = models.CharField(max_length=50)

class Ware(models.Model):
name = models.CharField(max_length=150)
rubricator = models.ForeignKey(Rubricator, blank = True, null = True, verbose_name='Рубрика')
пытаюсь сделать через admin actions, действие отправляет в шаблон где на форме выбирается рубрика в которую нужно передвинуть товары

Проблема в том что после выполнения действия у выбранных товаров не изменяется рубрика

Есть 2 вопроса:
Что я делаю не так?
Какими способами еще можно решить эту задачу?

код действия и формы:

admin.py
from django.views.generic.simple import direct_to_template
from django.core.context_processors import csrf
from ware.forms import WareMoveForm

class WareAdmin(admin.ModelAdmin):
actions = ('move_in_rubricator', )
def move_in_rubricator(self, request, queryset):
title = 'Move Ware to rubricator'
c = {}
c.update(csrf(request))
if request.method == 'POST':
form = WareMoveForm(request.POST)
if form.is_valid():
rubric = form.cleaned_data.get('rubricator')
queryset.update(rubricator = rubric)
else:
form = WareMoveForm()
context = {
'title': title,
'form': form,
}
return direct_to_template(request, 'ware_move.html', context)
move_in_rubricator.short_description = 'Move Wares to rubric'
forms.py
from django import forms
from mptt.forms import TreeNodeChoiceField
from ware.models import *

class WareMoveForm(forms.ModelForm):
rubricator = TreeNodeChoiceField(queryset=Rubricator.tree.all(), level_indicator = u'+--')
class Meta:
model = Ware
fields = ('rubricator', )
Код шаблона на который перенаправляет действие

ware_move.html
{% extends "admin/base_site.html" %}
{% load i18n l10n %}
{% block title %}
{{ title }}
<p>{{ debug }}</p>
{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="../../">Home</a> &rsaquo;
<a href="../">Wares</a> &rsaquo;
{% trans 'Move wares' %}
</div>
{% endblock %}

{% block content %}
<form method="post" action=".">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Move" />
{% endblock %}
appetito
здесь есть хороший пример
http://docs.djangoproject.com/en/1.3/ref/contrib/admin/actions/#actions-that-provide-intermediate-pages

т.о. вам из move_in_rubricator нужно всю логику перенести в функцию вида, на которую делать редирект из экшна move_in_rubricator
shepelin
спасибо, примерно так и решил проблему.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB