Различные пользователи получают одинаковые результаты поиска

Вопрос моего вопроса следующий. У меня есть форма Django с полем, которое наследует поле Selet2:

class Select2ModelField(MyBaseSelect2ModelField, AutoModelSelect2Field):
 '''
 Select2ModelField, that uses ajax to get autocomplete options. 
 Should be used by default.
 '''
 widget = Select2ChoiceWidget

class LimitedDepartmentChoiceField(Select2ModelField):
 def __init__(self, *args, **kwargs):
 super(LimitedDepartmentChoiceField, self).__init__(*args, **kwargs)

И затем я использую его в своей форме, создавая это поле в view.py, потому что содержимое этого поля зависит от данных запроса:

form = RepresentativeCreateEditForm(request.POST)
form.fields['department'] = LimitedDepartmentChoiceField(label=u'Department',
 queryset=Department.objects.filter(
 id__in=all_deps_ids))

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

Пожалуйста, может ли кто-нибудь сказать мне, как я могу решить эту проблему?

1 ответ

Похоже, что значение получает как атрибут класса (где-то на одном из ваших классов), а не как атрибут определенного экземпляра класса. Там много наследования происходит, поэтому вам, возможно, придется кое-что сделать, чтобы увидеть, где именно проблема. Я предполагаю, что это класс Select2ChoiceWidget.

Из вашего примера кода это похоже на все экземпляры Select2ModelField и его подклассы совместно используют один класс Select2ChoiceWidget между собой. Я бы подумал, что это станет причиной проблемы.

Я не знаю много о классах Django, которые вы используете, но, может быть, попробуйте что-то в этом направлении?

class Select2ModelField(MyBaseSelect2ModelField, AutoModelSelect2Field):
 '''
 Select2ModelField, that uses ajax to get autocomplete options. 
 Should be used by default.
 '''
 def __init__(self, *args, **kwargs):
 # Not sure if this is the proper way to instantiate this class,
 # but doing so would help avoid leaking data across the instances
 # of Select2ModelField and its subclasses.
 self.widget = Select2ChoiceWidget()
 # Do the parent class(es) for good measure.
 super(Select2ModelField, self).__init__(self, *args, **kwargs)

licensed under cc by-sa 3.0 with attribution.