[Django] Как вернуть значение для просмотра после выбора элемента из выпадающего списка - PullRequest
0 голосов
/ 30 июня 2019

Несмотря на то, что я прочитал документ django, я все еще не уверен, как использовать request.POST, чтобы получить значение из выпадающего списка, чтобы выполнить запрос к базе данных. И как вернуть детали выбранного значения обратно во внешний интерфейс, чтобы показать результат

Предположим, я могу выбрать "регион" в раскрывающемся списке, и он будет возвращать детали этого ресторана в этой категории региона

Класс Ресторан

class Restaurant(models.Model):
    restId = models.AutoField(db_column='restId', primary_key=True)
    restName = models.TextField(db_column='restName')
    phone = models.IntegerField()
    address = models.TextField()
    ratings = models.DecimalField(max_digits=2, decimal_places=1)
    cuisine = models.TextField()
    region = models.TextField()
    last_modify_date = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        managed = True
        db_table = "restaurant"

views.py

# def index_view(request):
    # rest_list = Restaurant.objects.all()
    # context = {
    #     'rest_list': rest_list
    # }
    # return render(request, 'index.html', context)

def get_name(request):
    # region = Restaurant.objects.all().order_by('region').values_list('region', flat=True)
    if request.method == 'GET':
        rest_form = RestaurantForm()
        return render(request, 'index.html', {'rest_form': rest_form})

index.html

        {% block content %}
    <form action="" method="post">
        {% csrf_token %}
            <select name = "rest_value">
                {% for rest in rest_form %}
                    <option value = {{ rest }} ></option>
                {%  endfor %}
            </select>
        <input type="submit" value="Select" name="region">
    </form>
    {% endblock %}

forms.py

from django.forms import ModelForm
from .models import Restaurant

class RestaurantForm(ModelForm):
    class Meta:
        model = Restaurant
        fields = ['region']

1 Ответ

1 голос
/ 30 июня 2019

Чтобы дать ответ в контексте вашего вопроса, вы можете заставить его работать со следующим кодом ( примечание: не проверено); но, пожалуйста, смотрите примечания внизу:

Python View:

def index_view(request):
    selected_region = None
    restaurants = Restaurant.objects.all()

    if request.method == "POST":
        # Filter restaurants by selected region, but only on a POST
        selected_region = request.POST.get("region")
        restaurants = restaurants.filter(region=selected_region)

    # Get a list of all unique regions (group by region)  
    regions = Restaurant.objects.order_by('region').values_list('region', flat=True)

    context = {
        'regions': regions,
        'restaurants': restaurants,
        'selected_region': selected_region
    }

    return render(request, 'index.html', context)

Шаблон Django:

<h1>Index</h1>
<form method="post">
    <select name="region">
         {% for region in regions %}
             <option
              value="{{ region }}"
              {% if selected_region == region %}
                  selected="selected"
              {% endif %}
             >{{ region }}</option>
         {% endfor %}
    </select>
    <input type="submit" value="Select">
</form>
{% if selected_region %}
  <p>
    Nice, you selected: {{ selected_region }}!
  </p>
  <p>
    Restaurants in this region:
  </p>
  <ul>
     {% for restaurant in restaurants %}
       <li>{{ restaurant.restName }}</li>
     {% endfor %}
  </ul>
{% endif %}

Некоторые баллы:

  • Вы назвали action в форме как "selectRegion" в своем коде. Это отправляет это на другой URL. В моем примере я удалил action из формы, чтобы он отправлял его по тому же URL-адресу, что и index.html.
  • Если у вас много «регионов», вы, вероятно, захотите сохранить их в другой таблице и сделать region внешним ключом в Restuarant.
  • Как уже отмечали другие, вам следует серьезно подумать об использовании форм Django . Основная причина этого заключается в том, что Django при использовании функциональности встроенных форм уже берет на себя большую часть тяжелой работы: дезинфекция, проверка и рендеринг.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...