I have a form with one field for choosing a method to sort objects. However, when I refer to this field to get it's value, it equals to HTML code that renders out this form. How do I solve this problem?
My form:
class sortChoice(forms.Form):
CHOICES = [('sbd', 'Сортировать по дате'),
('sbp', 'Сортировать по популярности')]
choice = forms.ChoiceField(choices = CHOICES, widget = forms.RadioSelect, label = 'Сортировка по')
My view:
@login_required(login_url = 'login')
def vacancyListView(request):
searchQueryNavbar = request.GET.get('search_navbar', '')
searchQueryVLpage = request.GET.get('search_vlpage', '')
form = sortChoice()
print(form['choice'])
if searchQueryNavbar or searchQueryVLpage:
if searchQueryNavbar:
searchQuery = searchQueryNavbar
else:
searchQuery = searchQueryVLpage
if form['choice'] == 'sbp':
queryset = Vacancy.objects.filter(Q(name__icontains = searchQuery) | Q(salary__icontains = searchQuery) | Q(competences__icontains = searchQuery)).order_by('-viewsAmount')
if form['choice'] == 'sbd':
queryset = Vacancy.objects.filter(Q(name__icontains = searchQuery) | Q(salary__icontains = searchQuery) | Q(competences__icontains = searchQuery)).order_by('-creationDate')
else:
queryset = Vacancy.objects.all().order_by('-viewsAmount')
context = {
'objectList':queryset,
'form':form
}
return render(request, "vacancyList.html", context)
Console output of print(from['choice'])
:
<ul id="id_choice">
<li><label for="id_choice_0"><input type="radio" name="choice" value="sbd" required id="id_choice_0">
Сортировать по дате</label>
</li>
<li><label for="id_choice_1"><input type="radio" name="choice" value="sbp" required id="id_choice_1">
Сортировать по популярности</label>
</li>
</ul>
You have to assign data to your form. See Bound and unbound forms
form = sortChoice(request.POST or request.GET)
After call form.is_valid()
, you will be able to access cleaned_data
.
And then your code is something like this:
@login_required(login_url = 'login')
def vacancyListView(request):
searchQueryNavbar = request.GET.get('search_navbar', '')
searchQueryVLpage = request.GET.get('search_vlpage', '')
form = sortChoice(request.POST or request.GET)
if searchQueryNavbar or searchQueryVLpage:
if searchQueryNavbar:
searchQuery = searchQueryNavbar
else:
searchQuery = searchQueryVLpage
if form.is_valid():
selected = form.cleaned_data.get("choice")
if selected == 'sbp':
queryset = Vacancy.objects.filter(Q(name__icontains = searchQuery) | Q(salary__icontains = searchQuery) | Q(competences__icontains = searchQuery)).order_by('-viewsAmount')
if selected == 'sbd':
queryset = Vacancy.objects.filter(Q(name__icontains = searchQuery) | Q(salary__icontains = searchQuery) | Q(competences__icontains = searchQuery)).order_by('-creationDate')
else:
queryset = Vacancy.objects.all().order_by('-viewsAmount')
context = {
'objectList':queryset,
'form':form
}
return render(request, "vacancyList.html", context)
I would change the choice keys as following :
CHOICES = [
('creationDate', 'Сортировать по дате'),
('viewsAmount', 'Сортировать по популярности')
]
then you don't have to use if else
and do like this:
queryset = Vacancy.objects.filter(
Q(name__icontains = searchQuery) | Q(salary__icontains = searchQuery) | Q(competences__icontains = searchQuery)
).order_by('-%s' % form.cleaned_data.get("choice"))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.