如何使用预填充的外键字段构建 Django CreateView

问题描述 投票:0回答:1

我有以下两个 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'),
]
django django-views django-forms django-templates
1个回答
0
投票

将外键传递到您的网址:

path("purchase-entry/add/<int:pk>/....)

然后在您的视图中,您可以重写

get_initial()
方法来重新填充项目字段:

class PurchaseCreateView(CreateView):
    ...
    def get_initial(self):
        item = self.get_object()
        return {" item": item.pk}
© www.soinside.com 2019 - 2024. All rights reserved.