Сессии пользователя Django становятся смешанными. - PullRequest
1 голос
/ 31 июля 2011

В интерфейсе администратора Django есть форма определенной модели, которую я хочу отображать различными способами, в зависимости от того, является ли зарегистрированный пользователь, обращающийся к этой форме, обычным пользователем или администратором. Это работает найти кроме одной ОГРОМНОЙ вещи: это смешано. Например, поля, которые должны редактироваться администратором, доступны только для чтения, после того как я непосредственно перед этим вошел в систему как «обычный» пользователь. Если я попытаюсь сделать то же самое сразу после перезапуска сервера, все будет работать нормально, и все поля будут доступны для редактирования. Я полагаю, что каким-то образом сессии пользователя перепутаны. Как справиться с этим?

Вот что у меня есть:

В приложении admin.py:

151 class AdminForm(ModelForm):
152     class Meta:
153         model = PromotionalSlot
154         exclude = ['deal']
155 
156 class NormalUserForm(ModelForm):
157     class Meta:
158         model = PromotionalSlot
159         exclude = ['site']
160         
161 class PromotionalSlotAdmin(admin.ModelAdmin):
162      def get_form(self, request, obj=None, **kwargs):
163         if request.user.is_superuser:
164             return AdminForm
165         else:
166             self.readonly_fields = ['start_date','end_date','level','city','status']
167             return NormalUserForm· 
168
169 admin.site.register(models.PromotionalSlot, PromotionalSlotAdmin)

Спасибо

1 Ответ

2 голосов
/ 31 июля 2011

Проблема в том, что ваше решение не является поточно-ориентированным.Django хранит экземпляр администратора, поэтому значение, установленное вами self.readonly_fields, используется также для всех последующих запросов в потоке.Вот как вы можете сделать это потокобезопасным:

class PromotionalSlotAdmin(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return []
        else:
            return ['start_date', 'end_date', 'level', 'city', 'status']

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            return AdminForm
        else:
            return NormalUserForm
...