1

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

4

2 回答 2

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

我希望它有帮助!:)您不妨看看超级方法的作用

(免责声明:无耻的自我宣传。)

于 2013-05-27T17:07:46.653 回答
0

不,你没有走在正确的轨道上:返回的对象get_object应该是 ; 的实例model。实际上,如果您覆盖get_objectmodel属性,则变得无关紧要。

有几种方法可以解决这个问题,但我自己可能会得到一个DetailView(带有详细信息),并通过该方法为模板Shop添加一个表单。表单的属性不是空的,而是指向将处理创建的单独的 url。Productget_context_dataactionCreateViewProduct

或者,您可以简单地Shop通过 显示详细信息get_context_data,这更简单但混合了关注点(因为DetailViewfor shop 被定义为CreateViewfor Product)。

于 2013-05-25T06:18:00.193 回答