在Django 1.5中将CreateView与DetailView结合使用

时间:2013-05-23 18:14:10

标签: django django-models django-templates django-views django-class-based-views

在我的应用程序中,我需要在商店中创建产品。所以我有一个模型商店和模型产品。我可以在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

2 个答案:

答案 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

(免责声明:无耻的自我推销。)