如何从ChoiceField下拉列表中获取值,并将筛选结果列表返回给前端?
当前,我只能在下拉列表中显示值,但无法返回所选结果
更新:现在我设法使用基于类的视图来显示它,但仍然无法在同一页面上显示过滤的结果
class Index(FormView):
template_name = 'index.html'
form_class = IndexForm
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
rest_list = Restaurant.objects.order_by('-restname')
query_results = Restaurant.objects.all()
region_list = regionChoiceField()
context['rest_list'] = rest_list
context['query_results'] = query_results
context['region_list'] = region_list
context['form'] = IndexForm()
return context
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
region_list = request.POST.get('region_list')
print("region_list - ", region_list)
# Where can I check the print out result? There is no return value in python console
return redirect(reverse('food_review:index'))
# want to return the list in the same page
<body>
<form method="post" name="dropdown">{% csrf_token %}
{{ region_list }}
</form>
<table>
{% for rest in query_results %}
<tr>
<td>{{ rest.restname }}</td>
</tr>
{% endfor %}
</table>
</body>
from .models import *
from django import forms
from django.forms import ModelForm
from django.forms import Widget
class regionChoiceField(forms.Form):
region = forms.ModelChoiceField(
queryset=Restaurant.objects.values_list("region",flat=True).distinct(),empty_label=None)
class IndexForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super().__init__(*args, **kwargs)
# self.error_class = ErrorListMsg
region_list = forms.ChoiceField(choices= [(r.id, r.region) for r in Restaurant.objects.all()], required=False,
widget=forms.Select())
#key: restaurant id, value: region of restaurant
def clean(self):
form_data = self.cleaned_data
class Restaurant(models.Model):
restname = models.CharField(max_length=200) # Field name made lowercase.
phone = models.IntegerField()
address = models.CharField(max_length=200)
cuisine = models.CharField(max_length=200)
region = models.CharField(max_length=200)
last_modify_date = models.DateTimeField()
created = models.DateTimeField()
def __str__(self):
return self.restname
app_name = 'food_review'
urlpatterns = [
url(r'^$', Index.as_view(), name='index'),
]
答案 0 :(得分:0)
您可以尝试创建基于类的视图而不是基于函数的视图,并导入表单mixin。
views.py
class Index(FormView):
template_name = 'index.html'
form_class = IndexForm
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
rest_list = Restaurant.objects.order_by('-restname')
query_results = Restaurant.objects.all()
region_list = regionChoiceField()
context['rest_list'] = rest_list
context['query_results'] = query_results
context['region_list'] = region_list
context['form'] = IndexForm()
return context
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
region_list = request.POST.get('region_list')
print("region_list - ", region_list)
return redirect(reverse('NextClassViewYouWantToRedirect'))
models.py (与您相同)
class Restaurant(models.Model):
restname = models.CharField(max_length=200) # Field name made lowercase.
phone = models.IntegerField()
address = models.CharField(max_length=200)
cuisine = models.CharField(max_length=200)
region = models.CharField(max_length=200)
last_modify_date = models.DateTimeField()
created = models.DateTimeField()
def __str__(self):
return self.restname
forms.py
from django import forms
from django.forms import Widget
class IndexForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super().__init__(*args, **kwargs)
# self.error_class = ErrorListMsg
region_list = forms.ChoiceField(choices= AnyChoiceTupleYouWantToBeDisplayed, required=False,
widget=forms.Select())
def clean(self):
form_data = self.cleaned_data
index.html (与您相同)
<body>
<form method="post" name="dropdown">{% csrf_token %}
{{ region_list }}
</form>
<table>
{% for rest in query_results %}
<tr>
<td>{{ rest.restname }}</td>
</tr>
{% endfor %}
</table>
</body>
此外,您还需要在urls.py文件中添加相同的内容(我假设您已经这样做了)
urls.py
from django.conf.urls import url, include
from .views import *
urlpatterns = [
url(r'^$', index.as_view(), name='index'),
]
让我知道它是否有效。 干杯:)