#django #forms #choicefield
#django #формы #поле выбора
Вопрос:
У меня есть форма (forms.Form), которая автоматически генерирует варианты для своего собственного choicefield как такового:
class UserForm(forms.Form):
def generate_choices():
from vn.account.models import UserProfile
up = UserProfile.objects.filter(user__isnull=True)
choices = [('0','--')]
choices = ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up])
return choices
user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices())
Моя проблема в том, что это отображается как поле выбора (как и предполагалось), но его содержимое каким-то образом кэшируется. Новые записи не отображаются до перезапуска сервера разработки на моем локальном компьютере или apache на удаленном сервере.
Когда выполняется оценка этого фрагмента кода? Как я могу сделать так, чтобы он пересчитывал записи каждый раз?
PS. memchached и другие виды кэширования отключены.
Ответ №1:
Начиная с версии 1.8 доступно лучшее решение: поле выбора Django имеет возможность передавать вызываемый параметр в choices.
Либо повторяющийся (например, список или кортеж) из двух кортежей для использования в качестве вариантов для этого поля, либо вызываемый, который возвращает такой итерируемый. Если аргумент является вызываемым, он вычисляется каждый раз при инициализации формы поля.
Итак, теперь вы можете просто написать
class UserForm(forms.Form):
def generate_choices():
from vn.account.models import UserProfile
up = UserProfile.objects.filter(user__isnull=True)
choices = [('0','--')]
choices = ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up])
return choices
user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices)
Также вы можете использовать ModelChoiceField для этой задачи.
Ответ №2:
Я думаю, вам нужно сделать это через init, чтобы он оценивался при вызове формы, что-то вроде
например
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
from vn.account.models import UserProfile
up = UserProfile.objects.filter(user__isnull=True)
choices = [('0','--')]
choices = ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name,s.company_name, s.username, s.email)) for s in up])
self.fields['user'].choices = choices