从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

compy.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'),
]

您可以尝试创建基于类的视图而不是基于函数的视图,而导入表单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'),
]

让我知道它是否有效。欢呼:(

最新更新