You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:如何在Lunchmenu ListView中获取关联Restaurant ID

嘿,我来帮你搞定这个问题!你完全可以在模板里实现这个需求,当然也可能需要对视图做一点点调整,下面我一步步给你讲清楚:

1. 先明确模型关联逻辑(参考示例)

首先假设你的Restaurant和Lunchmenu模型是类似这样的结构(如果和你的实际代码有出入,按需调整即可):

# models.py
from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=100)
    # 其他自定义字段,比如地址、评分等...

class Lunchmenu(models.Model):
    # 外键关联餐厅,related_name方便反向查询餐厅的所有菜单
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='lunchmenus')
    dish_name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    # 其他菜单字段...
2. 视图层的两种处理场景

根据你的使用场景,视图的写法会有区别:

场景一:展示单个餐厅的专属菜单列表

如果你的Lunchmenu ListView是用来展示某一家特定餐厅的菜单,那需要从URL里接收餐厅ID,过滤菜单数据,同时把餐厅实例传到模板:

# views.py
from django.views.generic import ListView
from .models import Lunchmenu, Restaurant

class LunchmenuListView(ListView):
    model = Lunchmenu
    template_name = 'lunchmenu_list.html'
    context_object_name = 'lunchmenus'

    def get_queryset(self):
        # 从URL参数中提取restaurant_id(需要对应URL配置)
        self.restaurant_id = self.kwargs.get('restaurant_id')
        # 只返回该餐厅的菜单
        return Lunchmenu.objects.filter(restaurant_id=self.restaurant_id)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 把当前餐厅实例传到模板,方便获取ID和其他信息
        context['current_restaurant'] = Restaurant.objects.get(id=self.restaurant_id)
        return context

场景二:遍历所有餐厅,每个餐厅对应菜单入口

如果是在餐厅列表页,给每个餐厅加一个跳转菜单的链接,那视图只需要返回所有餐厅数据即可:

# views.py
from django.views.generic import ListView
from .models import Restaurant

class RestaurantListView(ListView):
    model = Restaurant
    template_name = 'restaurant_list.html'
    context_object_name = 'restaurants_list'
3. 模板中获取Restaurant ID并设置href

对应场景一:单个餐厅的菜单页

在模板里直接从传递的餐厅实例中取ID,比如用来跳转回餐厅详情页:

<!-- lunchmenu_list.html -->
<h2>{{ current_restaurant.name }} 的今日午餐菜单</h2>
<!-- 跳转回餐厅详情页的href,用restaurant.id作为参数 -->
<a href="{% url 'restaurant_detail' current_restaurant.id %}">返回餐厅主页</a>

<ul>
{% for menu in lunchmenus %}
    <li>{{ menu.dish_name }} - ¥{{ menu.price }}</li>
{% endfor %}
</ul>

对应场景二:餐厅列表页跳转菜单

遍历restaurants_list时,直接访问每个餐厅对象的id属性,拼到菜单页的URL里:

<!-- restaurant_list.html -->
<h1>所有合作餐厅</h1>
<ul>
{% for restaurant in restaurants_list %}
    <li>
        {{ restaurant.name }}
        <!-- 跳转至该餐厅的菜单列表页,把restaurant.id作为URL参数 -->
        <a href="{% url 'lunchmenu_list' restaurant.id %}">查看今日菜单</a>
    </li>
{% endfor %}
</ul>
4. 配套的URL配置(关键)

要确保URL和视图、模板的参数对应上,比如:

# urls.py
from django.urls import path
from .views import LunchmenuListView, RestaurantListView

urlpatterns = [
    path('restaurants/', RestaurantListView.as_view(), name='restaurant_list'),
    path('restaurants/<int:restaurant_id>/lunchmenus/', LunchmenuListView.as_view(), name='lunchmenu_list'),
    # 假设还有餐厅详情页的URL
    path('restaurants/<int:pk>/', RestaurantDetailView.as_view(), name='restaurant_detail'),
]
核心要点总结
  • 模板里直接通过restaurant.id就能拿到单个餐厅的ID,不需要额外复杂操作
  • 如果菜单列表是绑定特定餐厅的,一定要通过URL参数把餐厅ID传到视图,再过滤菜单数据
  • 外键设置related_name后,还能直接用restaurant.lunchmenus.all()在模板里遍历该餐厅的所有菜单(如果需要的话)

这样应该就能完美解决你的问题啦,要是还有细节需要调整,可以根据自己的实际代码微调~

内容的提问来源于stack exchange,提问作者Peter Lukka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:59:51