Django Полный пример выпадающего меню из базы данных postgresql - PullRequest
0 голосов
/ 16 февраля 2019

Я довольно новичок в django (использую django 2.1.5 и python 3.7), и я не могу понять, как добавить выпадающее меню, показывающее элементы одного поля из таблицы в моей базе данных postgresql.В конечном итоге я хочу, чтобы пользователь мог выбрать один элемент из выпадающего меню, и я создам запрос с этим выбором и возвращаю результаты этого запроса.Но я застрял уже с выпадающим меню.Вот моя модель в файле models.py

class Locations(models.Model):
    gid = models.AutoField(primary_key=True)
    field_gid = models.BigIntegerField(db_column='__gid', blank=True, null=True)  # Field renamed because it contained more than one '_' in a row. Field renamed because it started with '_'.
    name_location= models.CharField(unique=True, max_length=254, blank=True, null=True)
    x = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    y = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    z = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    geom = geomodels.PointField(srid=3912)

    def __str__(self):
        return self.name_location

    class Meta:
        managed = False
        db_table = 'locations'
        verbose_name_plural = "Locations"

Вот моя форма в файле forms.py:

from .models import Locations
class LocationsForm(forms.ModelForm):
    class Meta:
        model = Locations
        fields = ('name_location',)
        #Down here is what I actually thought I need, but maybe I am not using it right 
        locations_list = forms.ModelChoiceField(queryset=Locations.objects.all().only('name_location').order_by('name_location'))

А затем в моем файле views.py:

from .forms import LocationsForm
def LocationsView(request):
    form = LocationsForm
    return render(request, 'geoportal/mforest.html', {'form': form})

Мой urls.py выглядит следующим образом:

from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='geoportal-home'),
path('mforest/', views.LocationsView, name='geoportal-mforest')
]

И, наконец, в моем файле шаблона mforest.html (я помещаю извлечение только потому, что файл base.html содержит содержимое блока, котороеЯ расширяю в mforest.html):

{% extends "geoportal/base.html" %}
{% block content %}
<div class="col-md-3" style="height: 100vh; border: 2px red; background-color: lightgray">
    <h3>Meteo Stations of the SFI</h3>
    <form method="GET">
        {% csrf_token %}
        {{ form }}
    </form>
    </div>
<div class="col-md-9">
    <h3>Output of the query</h3>
    <table width="100%" class="blueTable"> </table>
</div>
{% endblock content %}

Для файла шаблона я также попытался предложить несколько вариантов итерации по результату набора запросов.Однако ни одно из решений, которые я пробовал, не отображало мое выпадающее меню.Я уверен, что я делаю что-то не так, так как я не получаю ожидаемый результат, но я не знаю, что исправить.PS.Я не получаю ошибку.Это просто ничего не отображает.Заранее благодарю за помощь!

РЕДАКТИРОВАТЬ: Подробнее о том, чего я хочу достичь, , пожалуйста, нажмите здесь , чтобы увидеть, что у меня есть на моей странице (хотя почти ничего).(Не обращайте внимания на ярлык «kraj_odvze», который я заменил в этом вопросе на «name_location»).Сейчас;вместо того, чтобы иметь текстовое поле, я действительно хочу выпадающее меню с элементами из поля "name_location" в моей базе данных.Кроме того, я включу средство выбора даты и времени и кнопку для выполнения запроса для отображения в виде таблицы и графиков в правой части страницы моей страницы.

1 Ответ

0 голосов
/ 17 февраля 2019

Я понял проблему, благодаря комментарию @ art06.Поскольку я собираюсь запросить другую таблицу («Meteo»), в которой есть столбец, представляющий Foreign_key, который указывает на столбец «name_location» таблицы «Locations», я должен использовать вместо таблицы «Meteo» вместо «Locations».

Поэтому, имея файл models.py в виде следующих строк:

class Locations(models.Model):
    gid = models.AutoField(primary_key=True)
    field_gid = models.BigIntegerField(db_column='__gid', blank=True, null=True)  # Field renamed because it contained more than one '_' in a row. Field renamed because it started with '_'.
    name_location = models.CharField(unique=True, max_length=254, blank=True, null=True)
    x = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    y = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    z = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    geom = geomodels.PointField(srid=3912)

    def __str__(self):  # __unicode__ for py2
        return self.name_location

    class Meta:
        managed = False
        db_table = 'locations'
        verbose_name_plural = "Locations"


class Meteo(models.Model):
    time = models.DateTimeField()
    air_temp = models.FloatField(blank=True, null=True)
    soil_temp = models.FloatField(blank=True, null=True)
    precipitation = models.FloatField(blank=True, null=True)
    global_rad = models.FloatField(blank=True, null=True)
    relative_hum = models.FloatField(blank=True, null=True)
    wind_speed = models.FloatField(blank=True, null=True)
    swc = models.FloatField(blank=True, null=True)
    pressure = models.FloatField(blank=True, null=True)
    location = models.ForeignKey(Locations, models.DO_NOTHING, db_column='location', to_field='name_location')  # to_field is required because the Foreignkey field is a text
    id = models.BigAutoField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'meteo'
        unique_together = (('time', 'id'),)
        verbose_name_plural = "Meteo"

и forms.py следующим образом:

from django import forms
from .models import Meteo
class LocationsForm(forms.ModelForm):
    class Meta:
        model = Meteo
        fields = ('location',)

Путем изменения предыдущего вВ моем посте django форматирует поле как раскрывающееся меню, и оно хорошо отображается.

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

...