如何根据模型的不同子类的类型为它们分配不同的模板

2024-07-01 08:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class A(Model):
    pass

class B(A):
    pass

class C(A):
    pass

例如,在网上购物时,我会有EbookCDBall。我可以创建OneToOneOneToOneField的关系,但我认为在这种情况下,用户必须填写两个表单,首先他可能填写产品字段,然后填写类似ebook字段的表单。 我还想显示在数据库中的产品,无论是电子书,电影,CD播放器或任何其他类型,在产品列表中列出。 所以我决定这样做。 问题出在view部分,我必须决定应该显示哪个模板来填充。内洛是我决定解决这个问题的方法。但这个解决方案的问题是,我认为随着产品数量的增长,它并没有真正的用处,这将成为一场噩梦。我想知道如何改进这个解决方案

我对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 })

Tags: selfformreturninitrequestdefargstemplate
1条回答
网友
1楼 · 发布于 2024-07-01 08:40:58

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

所以在你的Product模型上有一个CharField叫做template,你可以用'book'、'ebook'等填充它

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

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

相关问题 更多 >

    热门问题