Django Form перезагрузить данные - PullRequest
6 голосов
/ 13 декабря 2011

У меня есть форма, которая вводит данные в БД. У меня есть другая форма с раскрывающимся полем, в которой используются данные, введенные первой формой.

Поэтому, когда я отправляю данные из первой формы, БД обновляется правильно. Но когда я загружаю вторую форму, выпадающий список не обновляется с последними данными.

Шаги для отладки

Проблема не в транзакции, фиксации и т. Д. Запрос на получение данных для раскрывающегося списка во второй форме является правильным.

Проблема также не в кеше представлений (потому что у нас нет промежуточного программного обеспечения кеша) Я также попробовал декораторы кеша, такие как @ never_cahce, @ cache_control и т. Д.

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

Первая страница

форма

class AddOrganization(forms.Form):   

    orgList = getOrgUnitList()     

    orgUnit = forms.CharField(label=u'Organization Name',
                                max_length=50,
                                error_messages={'required':'Organization name is required field.'})

    parentOrg= forms.ChoiceField(label=u'Parent Organization',
                           choices=[(u'Select',u'Select')]+orgList,
                           error_messages={'required':'Organization name is required field.'})

Вторая страница

форма

class AddUser(forms.Form):    

    orgUnitList = getOrgUnitList()        

    email = forms.EmailField(label=u'Email',
                             max_length=50,
                             error_messages={'required':'Email is required field'})  

    orgUnit = forms.ChoiceField(label=u'Organizational Unit',   
                      choices=orgUnitList,                        
                                error_messages={'required':'Organizational unit is required field'})    

Запрос

def getOrgUnitList():
    orgUnitList = list(OrganizationUnit.objects.values_list('OrgUnitID','OrgUnitName').order_by('OrgUnitName'))
    return orgUnitList

EDIT

Все нормально, если я использую модели. Почему?

1 Ответ

6 голосов
/ 13 декабря 2011

Проблема заключается в объявлении orgUnitList как свойства класса в форме.Это означает, что он вызывается один раз, когда форма изначально определена.Таким образом, новые элементы не будут видны, пока процесс сервера не будет перезапущен.

Один из способов исправить это - вызвать функцию getOrgUnitList внутри метода __init__ в форме:

class AddOrganization(forms.Form):
    ...
    def __init__(self, *args, **kwargs):
        super(AddOrganizationForm, self).__init__(*args, **kwargs)
        self.fields['orgUnit'].choices = getOrgUnitList()

В качестве альтернативы вы должны использовать ModelChoiceField для orgUnit, поскольку он автоматически обрабатывает подобные вещи.

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