如何在 django 中使用下拉框渲染到模板?

How to render to template with dropdownbox in django?

我是 Django 初学者。我在渲染模板时遇到了问题。 我有一个模型(models.py),其中包含 class“FuelInfo”;包括外键。

from django.db import models


class Traveler(models.Model):
    traveler_name = models.CharField(max_length=10)

    def __str__(self):
        return self.traveler_name

class FuelInfo(models.Model):
    name = models.ForeignKey(Traveler, on_delete=models.SET_NULL, null=True)
    car = models.CharField(null=True, max_length=50)
    efficiency = models.FloatField()

    def __str__(self):
        return str(self.name)

另外 views.py 就像:

from django.shortcuts import render, get_object_or_404
from .models import FuelInfo

def traveler_list(request):
    travelers = FuelInfo.objects.all()
    context = {'travelers':travelers}
    return render(request, 'fuelcost/home.html', context)

def traveler_detail(request, pk):
    traveler = get_object_or_404(FuelInfo, pk=pk)
    return render(request, 'fuelcost/calfuel.html', {'traveler': traveler})

而urls.py是:

from django.urls import path
from . import views


app_name = 'fuelcost'
urlpatterns = [
    path('', views.traveler_list, name='home'),
    path('<int:pk>/', views.traveler_detail, name='calfuel'),
]

我想制作一个下拉菜单,呈现给 home.html 中的模板“calfuel.html”。 所以我做了一个模板(“home.html”),比如:

{% extends "base_generic.html" %}

{% block content %}
    <body>

        {% if travelers %}

        <form method="POST" action="{% url 'fuelcost:calfuel' pk=traveler.pk %}">
        {% csrf_token %}
        <select name="traveler">
        {% for traveler in travelers %}
            <option value="{{ traveler.id }}">{{ traveler.name }}</option>
        {% endfor %}    
        </select>
        
        <input type="submit" value="Select" />
        </form>
        
        {% else %}
        <p>No travelers are available</p>
        
        {% endif %}

    </body>

{% endblock %}

但它不起作用,我收到错误消息。

(我的 urlpattern 是 fuelcost/。) 实际上我可以进入 fuelcost/1 或 fuelcost/2 即 views.traveler_detail 命名为“calfuel”。但我无法进入 fuelcost/ ,即 views.traveler_list 命名为“家”。

我不知道我还要做些什么。请告诉我这有什么问题。

{% block content %}
<body>

    {% if travelers %}
    {% for traveler in travelers %}
    <form method="POST" action="{% url 'fuelcost:calfuel' pk=traveler.pk %}">
    {% csrf_token %}
    <select name="traveler">
        <option value="{{ traveler.id }}">{{ traveler.name }}</option>    
    </select>
    
    <input type="submit" value="Select" />
    </form>
    {% endfor %}
    
    {% else %}
    <p>No travelers are available</p>
    
    {% endif %}

</body>
{% endblock %}

你必须将表格保持在循环内,这样它才能获得旅行者的 pk