Как создать выпадающий список в формах в django со значениями из базы данных
Я пытаюсь создать форму с выпадающим полем, в котором пользователь может выбрать местоположение из предварительно существующих мест в таблице.Застрял на том, что делать
forms.py
from django import forms
from .models import Vehicles
from .models import HomeLocation
class VehicleForm(forms.ModelForm):
HomeLocation= forms.ModelChoiceField (queryset=HomeLocation.objects.all(),
empty_label="Select a home location" # Optional
)
class Meta:
model = Vehicles
feilds=['home_location','model','make','year']
exclude = ['Location lat', 'Location long']
model.py
from django.db import models
class HomeLocation(models.Model):
home_location_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
address = models.CharField(max_length=255)
class Vehicles(models.Model):
vehicle_id = models.AutoField(primary_key=True)
home_location = models.ForeignKey(HomeLocation, models.DO_NOTHING)
model = models.CharField(max_length=255)
make = models.CharField(max_length=255)
year = models.IntegerField()
views.py
from django.shortcuts import render
from .models import Vehicles
from .models import HomeLocation
from .forms import VehicleForm
from django.contrib import messages
from django.http import HttpResponse
# Create your views here.
def addVehicle(request):
if request.method =="POST":
form = VehicleForm(request.POST or None)
if form.is_valid():
form.save()
messages.success(request,("Vehicle has been added successfully"))
else:
return render(request,'add_vehicle.html',{})
add_vehicle.html
<form method="POST" action= "{% url 'addVehicle' %}">
{% csrf_token %}
<div class="form-header">
<h1>Add Vehicle</h1>
</div>
<div class="form-group">
<div class="mb-3">
<select>
{% for i in HomeLocation %}
<option value="{{ i.home_location_id }}"> {{ i.name }} </option>
{% endfor %}
</select>
</div></div>
Это то, что я сделал до сих пор. Но в выпадающем списке не видно данных, как видно. Что мне нужно сделать.
В самом простом виде это то, что вы хотите сделать
В вашем файле forms.py
class VehicleForm(forms.ModelForm):
class Meta:
model = Vehicles
fields = ['home_location ','model','make','year',]
required = ('home_location ','model','make','year',)
в вашем файле views.py:
if request.method =='POST':
form = VehicleForm(request.POST)
if form.is_valid():
form.save()
return redirect('<your success redirect link>')
form=VehicleForm()
context = {'form': form,}
return render(request, '<path-to add_vehicle.html>',context)
в вашем шаблоне:
<form method="POST" action= "">
{% csrf_token %}
<div class="form-header">
<h1>Add Vehicle</h1>
</div>
<div class="form-group">
<div class="mb-3">
{{form}}
</div></div>
Еще несколько пунктов:
вам не нужны эти поля в ваших моделях: home_location_id и vehicle_id
эти поля будут сгенерированы автоматически и на них можно ссылаться как <object>.id