如何根据模型的类型为模型的每个不同子类分配不同的模板

时间:2014-03-12 06:39:01

标签: python django

我的Django项目中有一些模型是基础模型类的子类。例如:

class A(Model):
    pass

class B(A):
    pass

class C(A):
    pass

例如,在线购物我会EbookCDBall。我可以与OneToOne创建OneToOneField关系,但我认为在这种情况下,用户必须填写两个表单,首先他可能填写产品字段,然后填写电子书字段等表单。 此外,我想在产品列表中列出数据库中的产品,即Ebook或Movie或CD Player或其他任何类型的产品。  所以我决定用这种方式创建模型。 问题出现在view部分,我必须决定填写哪个模板.nelow是我决定解决这个问题的方式。但是这个解决方案的问题在于我认为它不是很有用,因为产品数量的增长将成为一场噩梦。我想知道如何改进这个解决方案。

我是python和Django的新手。我经常搜索,但找不到任何东西。

class Product(models.Model):
    product_type = models.CharField(max_length=10, default=self.__class__.__name__, editable=False)

    def getType(self):
        return self.product_type

    def __init__(self, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)


class Book(Product):
    def __init__(self, *args, **kwargs):
        Product.__init__(self, *args, **kwargs)
        self.product_type == self.__class__.__name__

@login_required
def edit(request, product_id):
    try:
        product = Product.objects.get(pk=service_id)
    except Product.DoesNotExist():
        return HttpResponseNotFound()

    if product.getType() == 'Ebook':
        product = product.ebook
        formObject = EbookForm
        template = 'products/edit_ebook.html'
    elif product.getType() == 'CD':
        product = product.host
        formObject = CdForm
        template = 'products/edit_cd.html'
    elif product.getType() == 'Dress':
        formObject = DressForm
        template = "products/edit_dress.html"

    if request.method == 'POST':
        form = formObject(request.POST, instance=product)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('product_index'))
    else:
        form = formObject(instance=product)

    return render(request, template, {'form' : form })

1 个答案:

答案 0 :(得分:1)

如果您将模板名称存储在模型中,则可以删除所有if语句,因此您只需拨打render(request, product.template, {'form': form})

因此,您的CharField模型上会有template名为Product的{​​{1}},您可以填写“预订'电子书”,等

这背后的原理被称为" replace conditional with polymorphism"。

您还应该考虑使用抽象基础模型,这样可以提高性能。