在 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_objectmodel 属性就变得无关紧要了。

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

或者,您可以通过get_context_data 简单地显示Shop 详细信息,这更简单但混合了问题(因为商店的DetailView 被定义为ProductCreateView)。

【讨论】:

以上是关于在 Django 1.5 中结合 CreateView 和 DetailView的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Django 1.5 中使用自定义用户模型

在 django 1.5 CBV 中返回 HttpResponse 时的 simplejson 错误

无法在 Django 1.5 中使用自定义用户模型创建超级用户

Python/Django 1.5 DatabaseWrapper 线程错误

在 Django 1.5 自定义用户模型中使用电子邮件作为用户名字段导致 FieldError

Django 1.7 vs Django1.6 vs Django 1.5 [关闭]