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

如何构建带有预填充外键字段的Django CreateView

解决方案

1. 新增采购记录的创建视图

在视图文件中添加PurchaseEntryCreateView,用来处理带Item主键的采购记录创建请求,实现预填充逻辑:

from django.views.generic.edit import CreateView
from .models import PurchaseEntry, Item
from django.urls import reverse_lazy

class PurchaseEntryCreateView(LoginRequiredMixin, CreateView):
    template_name = 'inventory/add-purchase-entry.html'
    model = PurchaseEntry
    # 仅列出需要用户填写的字段,不要包含item
    fields = ['采购数量', '采购日期']  # 替换为PurchaseEntry实际的其他字段
    
    def get_initial(self):
        # 从URL参数中获取Item主键,设置表单初始值
        initial = super().get_initial()
        item_pk = self.kwargs.get('item_pk')
        if item_pk:
            initial['item'] = Item.objects.get(pk=item_pk)
        return initial

    def form_valid(self, form):
        # 强制绑定URL传递的Item,防止前端篡改
        item_pk = self.kwargs.get('item_pk')
        form.instance.item = Item.objects.get(pk=item_pk)
        return super().form_valid(form)

    def get_success_url(self):
        # 创建完成后跳回对应Item的详情页
        return reverse_lazy('inventory-item-details', kwargs={'pk': self.kwargs.get('item_pk')})

2. 配置带Item主键的URL规则

在URL配置文件中添加采购记录创建的路由,接收item_pk参数:

urlpatterns = [
    # 原有URL保持不变
    path('', views.ItemListView.as_view(), name='inventory'),
    path('items/add/', views.ItemCreateView.as_view(), name='inventory-item-add'),
    path('items/<int:pk>/', views.ItemDetailsView.as_view(), name='inventory-item-details'),
    path('items/<int:pk>/delete', views.ItemDeleteView.as_view(), name='inventory-item-delete'),
    # 新增采购记录创建路由
    path('items/<int:item_pk>/purchase/add/', views.PurchaseEntryCreateView.as_view(), name='inventory-purchase-entry-add'),
]

3. 修改Item列表模板,添加带参数的跳转链接

在inventory/home.html的表格中,为每行Item生成指向采购记录创建页的链接,携带当前Item的主键:

<table>
  {% for item in items %}
  <tr>
    <td>{{ item.description }}</td>
    <td>{{ item.total_quantity }}</td>
    <td>
      <a href="{% url 'inventory-purchase-entry-add' item_pk=item.pk %}">创建采购记录</a>
    </td>
  </tr>
  {% endfor %}
</table>

4. 优化采购记录表单模板

在inventory/add-purchase-entry.html中,将item字段设置为隐藏,避免用户修改:

<form method="post">
  {% csrf_token %}
  <!-- 隐藏item字段,用户不可见也不可修改 -->
  {{ form.item.as_hidden }}
  <!-- 渲染其他需要用户填写的字段 -->
  {{ form.as_p }}
  <button type="submit">保存采购记录</button>
</form>

如果需要让用户看到当前关联的Item信息但无法修改,可以调整为:

<form method="post">
  {% csrf_token %}
  <div>
    <label>关联物品:</label>
    <span>{{ form.item.instance.description }}</span>
    {{ form.item.as_hidden }}
  </div>
  {{ form.as_p }}
  <button type="submit">保存采购记录</button>
</form>

内容的提问来源于stack exchange,提问作者saad.sawash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:11:20