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

Python 如何根据模型的每个不同子类的类型为其分配不同的模板,python,django,Python,Django,我在Django项目中有一些模型,它们是基本模型类的子类。例如: class A(Model): pass class B(A): pass class C(A): pass 例如,在网上购物时,我会有Ebook,CD,Ball。我可以创建OneToOne与OneToOneField的关系,但我认为在这种情况下,用户必须填写两个表单,首先他可能填写一个产品字段,然后填写一个类似电子书字段的表单。 我还想在数据库中显示产品,无论是电子书、电影、CD播放器还是其他类型的

我在Django项目中有一些模型,它们是基本模型类的子类。例如:

class A(Model):
    pass

class B(A):
    pass

class C(A):
    pass
例如,在网上购物时,我会有
Ebook
CD
Ball
。我可以创建
OneToOne
OneToOneField
的关系,但我认为在这种情况下,用户必须填写两个表单,首先他可能填写一个产品字段,然后填写一个类似电子书字段的表单。 我还想在数据库中显示产品,无论是电子书、电影、CD播放器还是其他类型的产品,都要在产品列表中列出。 所以我决定以这种方式创建模型。 问题出在
视图
部分,我必须决定应该显示哪个模板来填充。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 })

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

因此,在您的
产品
模型上有一个名为
模板的
CharField
,您可以用“book”、“ebook”等填充它

这背后的原理被称为“”


您还应该考虑使用抽象基模型,这对性能更好。

我可能会将它们作为属性添加到类中。我不确定django模型是如何工作的,但在应用程序引擎模型中,它们需要加上前缀
。e、 g.
\u formObject=EbookForm
当我看到这个时,我的眼睛流血了:`product.getType()=='Ebook'`。Python不是Java@Oz123我刚刚读了那篇文章,发现了
getType()
让你恼火的原因。很抱歉:D,正如我所说,我是新来的蟒蛇,不需要道歉:-)这就是我给链接的原因。相反,你可以从中学习。我应该为这刺耳的语气道歉。谢谢。我曾考虑在模型中存储模板名称,但这对我来说有些奇怪,我认为在模型中放置与视图相关的(Django中的模板)信息违反了最佳实践规则