Navayal code (partially copied)

The essence of the question, how to use the queryset? It is necessary to display the list of users filtered by the form. (I sculpt a webmord for a freeradius server, based on an old project, adapt, redo

views.py

class Users(ListView): #переназначаем шаблон template_name = 'hsCore/radmin/users.html' #переназначаем имя для object_list модели context_object_name = 'users' #сокращенный вариант от queryset = RadUser.objects.all() model = RadUser #количество отображений на странице paginate_by = 50 #сортировка отображения def get_queryset(self): filter_form = RadUserFilterForm(self.request.GET) # проверяем валидность вормы if filter_form.is_valid(): # извлекаем валидные данные из формы is_active = filter_form.cleaned_data.get('is_active', '') # проверяем активен ли пользователь if is_active == '1': queryset = self.queryset.filter_is_active(True) elif is_active == '0': queryset = self.queryset.filter_is_active(False) is_online = filter_form.cleaned_data.get('is_online', '') if is_online == '0': queryset = self.queryset.filter_is_online(False) elif is_online == '1': queryset = self.queryset.filter_is_online(True) q = filter_form.cleaned_data.get('username', '') if q: queryset = self.queryset.filter(username__icontains=q) return render_to_response( self.template_name, {'query_set': queryset, 'filter_form': filter_form, 'request': self.request}, context_instance=RequestContext(self.request) ) def get_context_data(self, **kwargs): pass 

more sorting is required on output by pages, but has not yet figured out how to do it with the help of paginator (can someone tell me?).

forms.py

 class RadUserFilterForm(forms.Form): username = forms.CharField(required=False) #список состояний пользователья #Первый элемент каждого кортежа – это значение, которое будет сохранено в базе данных. # Второй элемент – название, которое будет отображаться для пользователей is_active = forms.ChoiceField(choices=[('-1', 'Any'), ('1', 'Active'), ('0', 'Suspended')], initial="-1") is_online = forms.ChoiceField(choices=[('-1', 'Any'), ('0', 'Offline'), ('1', 'Online')], initial="-1") # group = forms.CharField(required=False) 

in line

 self.template_name, {'query_set': queryset, 'filter_form': filter_form, 'request': self.request}, 

Mistake

Local variable 'queryset' might be referenced before assignment

I still do not understand how to fix it.

  • The queryset variable is not defined. See how you go through the conditions in which it should be determined. - mkkik

1 answer 1

In the views.py file In the condition if filter_form.is_valid (): queryset = value, everywhere specified.

But if the condition does not work, the value of the queryset variable does not exist, as well as its declaration.

You must either define the queryset at the same level as filter_form

or return render_to_response two times, when the condition is true and when not (do not specify a queryset).

 def get_queryset(self): filter_form = RadUserFilterForm(self.request.GET) queryset = None # объявляем переменную с ее значением # проверяем валидность формы if filter_form.is_valid(): # извлекаем валидные данные из формы is_active = filter_form.cleaned_data.get('is_active', '') # проверяем активен ли пользователь if is_active == '1': queryset = self.queryset.filter_is_active(True) elif is_active == '0': queryset = self.queryset.filter_is_active(False) is_online = filter_form.cleaned_data.get('is_online', '') if is_online == '0': queryset = self.queryset.filter_is_online(False) elif is_online == '1': queryset = self.queryset.filter_is_online(True) q = filter_form.cleaned_data.get('username', '') if q: queryset = self.queryset.filter(username__icontains=q) # вот на этом уровне queryset было не определено 'query_set': queryset используется ниже return render_to_response( self.template_name, {'query_set': queryset, 'filter_form': filter_form, 'request': self.request}, context_instance=RequestContext(self.request) )