Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Изменение значения поля у нескольких объектов модели. Admin Actions [RSS Feed]

#1 Май 20, 2011 07:19:23

shepelin
От:
Зарегистрирован: 2011-01-31
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение значения поля у нескольких объектов модели. Admin Actions

Здравствуйте. Столкнулся с такой задачей есть две модели Рубрикатор и Товар.

Задача сделать возможность изменения у одного или нескольких товаров изменять поле 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 %}



Отредактировано (Май 20, 2011 07:20:20)

Офлайн

#2 Май 21, 2011 22:55:04

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Изменение значения поля у нескольких объектов модели. Admin Actions

здесь есть хороший пример
http://docs.djangoproject.com/en/1.3/ref/contrib/admin/actions/#actions-that-provide-intermediate-pages

т.о. вам из move_in_rubricator нужно всю логику перенести в функцию вида, на которую делать редирект из экшна move_in_rubricator



Офлайн

#3 Май 23, 2011 05:16:46

shepelin
От:
Зарегистрирован: 2011-01-31
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение значения поля у нескольких объектов модели. Admin Actions

спасибо, примерно так и решил проблему.



Офлайн

  • Начало
  • » Django
  • » Изменение значения поля у нескольких объектов модели. Admin Actions[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version