Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Не обновляется список пользователей на форме [RSS Feed]

#1 Март 3, 2008 08:29:17

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Здравствуйте!
Надо, чтобы на форме было поле со списком пользователей (django.contrib.auth.models.User). Сделал так:

def UserList():
return tuple([(x.pk, x.last_name + ‘ ’ + x.first_name)
for x in User.objects.order_by('last_name') if x.is_active])

class NewTaskForm(forms.Form):
executor = forms.ChoiceField(choices = UserList())

Все работает, однако если добавить нового пользователя или поменять существующего, то эти изменения отразятся в форме только после перезапуска апача. В чем тут дело?

Django 0.97, mod_python, Apache 2.2

Спасибо.



Офлайн

#2 Март 3, 2008 14:24:09

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

johnny
executor = forms.ChoiceField(choices = UserList())
скобки после UserList лишние



Офлайн

#3 Март 3, 2008 16:31:24

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Попробовал, получил исключение:
“TypeError at /addtask/0/
'function' object is not iterable”



Офлайн

#4 Март 3, 2008 17:57:59

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Видимо старая джанга?
тогда так

class UserList(object):
    def __iter__(self):
         return [(x.pk, x.last_name + ' ' + x.first_name)
               for x in User.objects.order_by('last_name') if x.is_active]



Офлайн

#5 Март 3, 2008 18:50:17

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Спасибо, завтра попробую. А не могли бы вы пояснить, почему так происходит?



Офлайн

#6 Март 3, 2008 19:09:24

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Не изменяется, поскольку функция вызывается один раз при создании класса формы. Т.е. там сохраняется значение те, которые были на момент создания класса. Задача - сделать так чтобы список каждый раз был новый. Первый вариант, передать callback функцию, но у вас не работает, скорей всего из-за старой версии джанги. Второй вариант, сделать в таком случае класс (и передать в качестве choices его объект) с методом __iter__, чтобы, опять таки, каждый раз он вызывался и возвращал новый список.



Офлайн

#7 Март 4, 2008 07:25:31

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Так как вы написали - выдает ошибку __iter__() возвращает не iterator.
Так работает:

class UserList(object):
    def __iter__(self):
        L = [(x.pk, x.last_name + ' ' + x.first_name)
                for x in User.objects.order_by('last_name') if x.is_active]
        return L.__iter__()
Однако желаемого эффекта это не дало. В конструкторе виджета Select
def __init__(self, attrs=None, choices=()):
        super(Select, self).__init__(attrs)
        # choices can be any iterable, but we may need to render this widget
        # multiple times. Thus, collapse it into a list so it can be consumed
        # more than once.
        self.choices = list(choices)
насколько я понял, все приводится к списку.
Судя по вашим постам, я использую не последнюю джангу. Счас попробую поставить последнюю ревизию из их репозитория.

Мне непонятно вот что: форма-то создается каждый раз при вызове view. Соответственно, создается и этот виджет. Почему же при этом не дергается моя функция (ваш класс)?



Отредактировано (Март 4, 2008 07:26:36)

Офлайн

#8 Март 4, 2008 08:15:11

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

поставил джангу из репозитория (ревизия 7189). Вернулся к функции, попробовал без скобок (executor = forms.ChoiceField(choices = UserList). Получил ту же ошибку: ‘function’ object is not iterable…
Попробовал руками во view-функции присваивать form.fields.choices = UserList() - все заработало…



Офлайн

#9 Март 4, 2008 20:24:38

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

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

class NewTaskForm(forms.Form):
  executor = forms.ChoiceField(choices = UserList())
следующий подход
class NewTaskForm(forms.Form):
    executor = forms.ChoiceField(choices=())
    def __init__(self, data=None, *args, **kwargs):
        super(NewTaskForm, self).__init__(data, *args, **kwargs)
        self.fields['executor'].choices = UserList()
иначе говоря,не засоряйте логику вьюсов разнообразными манипуляциями с формой (моделями, классами и тд, и тп)



Отредактировано (Март 4, 2008 20:25:10)

Офлайн

#10 Март 5, 2008 10:26:28

johnny
От:
Зарегистрирован: 2008-03-03
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Не обновляется список пользователей на форме

Спасибо за ответы, так наверное и сделаю. Странно, что в доке на эту тему ничего не написано…



Офлайн

  • Начало
  • » Django
  • » Не обновляется список пользователей на форме[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version