Получить значение из ChoiceField и вернуть отфильтрованный результат - PullRequest
0 голосов
/ 06 июля 2019

Как получить значение из раскрывающегося списка 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 голосов
/ 06 июля 2019

Вы можете попробовать создать представление на основе классов вместо функций на основе функции и импортировать миксин форм.

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

Дайте мне знать, если это работает.Ура :) 1030 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...