Django формирует поле выбора автоматически сгенерированных выборов - PullRequest
2 голосов
/ 12 мая 2011

У меня есть форма (forms.Form), которая автоматически генерирует варианты выбора для своего собственного поля выбора следующим образом:

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())

Моя проблема заключается в том, что это отображается в виде поля выбора (по назначению), но егосодержимое кэшируется как-то.Новые записи не отображаются до того, как я перезапущу dev-сервер на моем локальном компьютере или apache на удаленном сервере.

Когда оценивается этот фрагмент кода?Как я могу сделать так, чтобы он пересчитывал записи каждый раз ?

PS.memchached и другие виды кэширования отключены.

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Я думаю, вам нужно сделать это через 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
1 голос
/ 28 апреля 2016

Лучшее решение доступно, начиная с версии 1.8: Django ChoiceField имеет возможность передавать вызываемый элемент на выбор .

Любой повторяемый (например, список или кортеж)из 2-х кортежей для использования в качестве выбора для этого поля или для вызова, который возвращает такую ​​итерацию.Если аргумент является вызываемым, он оценивается каждый раз при инициализации формы поля.

Так что теперь вы можете просто написать

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 для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...