我有以下两个 Django 模型:
class Item(models.Model):
description = models.CharField(max_length=250)
total_quantity = models.PositiveSmallIntegerField(default=0)
def get_absolute_url(self):
return reverse_lazy('inventory-item-details', kwargs={'pk': self.pk})
class PurchaseEntry(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
...
我正在显示表格内的所有 Item 对象。
我在每个行项目旁边添加了一个链接。该链接标记为“创建购买条目”,打开该链接时,它应该显示一个用于创建 PurchaseEntry 对象的表单(我将为此使用通用的 CreateView)。
除了一个关键部分之外,一切都很简单。
打开表单时,我希望该项目预先填充我刚刚单击其链接的项目,这样用户就不必再次从项目列表中进行选择。
唯一想到的是在导航到表单时包含主键,并使用该主键选择其中一个选项。但老实说我不知道如何实现这个,目前这只是一个想法,也许你有更好的?
仅供参考,为了让您更好地帮助我,这里还有一些代码: 我的观点文件:
class ItemListView(LoginRequiredMixin, generic.ListView):
template_name = 'inventory/home.html'
context_object_name = 'items'
model = Item
class ItemDetailsView(LoginRequiredMixin, generic.DetailView):
template_name = 'inventory/item-details.html'
context_object_name = 'item'
model = Item
class ItemCreateView(LoginRequiredMixin, generic.CreateView):
template_name = 'inventory/add-item.html'
model = Item
fields = '__all__'
success_url = reverse_lazy('inventory')
class ItemDeleteView(LoginRequiredMixin, generic.DeleteView):
model = Item
success_url = reverse_lazy('inventory')
我的网址文件:
urlpatterns = [
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("purchase-entry/add/<int:pk>/....)
然后在您的视图中,您可以重写
get_initial()
方法来重新填充项目字段:
class PurchaseCreateView(CreateView):
...
def get_initial(self):
item = self.get_object()
return {" item": item.pk}