从ChoiceField获取值并返回过滤后的结果

时间:2019-07-06 10:15:00

标签: python django

如何从ChoiceField下拉列表中获取值,并将筛选结果列表返回给前端?

当前,我只能在下拉列表中显示值,但无法返回所选结果

更新:现在我设法使用基于类的视图来显示它,但仍然无法在同一页面上显示过滤的结果

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) 
# 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

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>

forms.py

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

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

urls.py

app_name = 'food_review'
urlpatterns = [
    url(r'^$', Index.as_view(), name='index'),
]

1 个答案:

答案 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'),
]

让我知道它是否有效。 干杯:)