在 Django 1.5 中结合 CreateView 和 DetailView
Posted
技术标签:
【中文标题】在 Django 1.5 中结合 CreateView 和 DetailView【英文标题】:Combine CreateView with DetailView in Django 1.5 【发布时间】:2013-05-19 05:37:24 【问题描述】:在我的应用中,我需要在商店中创建产品。所以我有一个模型店和一个模型产品。我可以在 DetailView ShopDetail
中查看有关我店铺的详细信息。现在我需要一个 CreateView 来创建产品,但 url 应该是/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
【问题讨论】:
大概你有来自Product
> Shop
的FK 关系,所以你需要在后台在CreateView
中设置该关系(通过从url 获取id 并手动分配关系),然后将该字段隐藏在新表单中,以便当用户创建新实例时,将保存关系。或者,您可以在用户发布他们的表单并对其进行验证时设置关系商店。
Hej 蒂米。我知道我可以在保存表单数据之前通过设置 form.instance.shop 在 form_valid 中处理这个问题,但我还必须设置我猜的上下文数据,所以我可以在模板中获取商店名称
【参考方案1】:
我认为你需要:
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。
(免责声明:无耻的自我宣传。)
【讨论】:
【参考方案2】:不,你没有走在正确的轨道上:get_object
返回的对象应该是model
的实例;事实上,如果你覆盖 get_object
,model
属性就变得无关紧要了。
有几种方法可以解决这个问题,但我自己可能会得到一个DetailView
(带有Shop
详细信息),并通过get_context_data
方法将Product
的表单添加到模板中.表单的 action
属性不是空的,而是指向一个单独的 CreateView
的 url,它将处理 Product
的创建。
或者,您可以通过get_context_data
简单地显示Shop
详细信息,这更简单但混合了问题(因为商店的DetailView
被定义为Product
的CreateView
)。
【讨论】:
以上是关于在 Django 1.5 中结合 CreateView 和 DetailView的主要内容,如果未能解决你的问题,请参考以下文章
在 django 1.5 CBV 中返回 HttpResponse 时的 simplejson 错误
无法在 Django 1.5 中使用自定义用户模型创建超级用户
Python/Django 1.5 DatabaseWrapper 线程错误