在我的应用程序中,我需要在商店中创建产品。所以我有一个模型商店和模型产品。我可以在DetailView ShopDetail
中查看有关我的商店的详细信息。现在我需要一个CreateView来创建产品,但是网址应该是/shops/shop-id/products/create/
,所以我在商店里面创建产品。我想这就像是
class ProductCreate(SingleObjectMixin, CreateView):
model = Product
def get_object(self, queryset=None):
return Shop.objects.get(id = self.kwargs['shop_id'])
我是否在正确的轨道上? :-D
答案 0 :(得分:0)
不,你没有走上正轨:get_object
返回的对象应该是model
的一个实例;实际上,如果您覆盖get_object
,则model
属性变得无关紧要。
有一些方法可以解决这个问题,但我自己可能只需要一个DetailView
(包含Shop
个详细信息),并为模板添加Product
表单通过get_context_data
方法。表单的action
属性不是空的,而是指向一个单独的CreateView
的网址,用于处理Product
创建。
或者,您只需在Shop
中显示get_context_data
详细信息,这样更简单但会引起关注(因为商店的DetailView
被定义为CreateView
{ {1}})。
答案 1 :(得分:0)
我认为你需要:
from django.shortcuts import get_object_or_404
class ProductCreate(CreateView):
"""Creates a Product for a Shop."""
model = Product
def form_valid(self, form):
"""Associate the Shop with the new Product before saving."""
form.instance.shop = self.shop
return super(CustomCreateView, self).form_valid(form)
def dispatch(self, *args, **kwargs):
"""Ensure the Shop exists before creating a new Product."""
self.shop = get_object_or_404(Shop, pk=kwargs['shop_id'])
return super(ProductCreate, self).dispatch(*args, **kwargs)
def get_context_data(self, **kwargs):
"""Add current shop to the context, so we can show it on the page."""
context = super(ProductCreate, self).get_context_data(**kwargs)
context['shop'] = self.shop
return context
我希望它有所帮助! :)
您可能希望查看what the super-methods do。
(免责声明:无耻的自我推销。)