2014-03-12 54 views
1

我在我的Django項目中有一些模型是基礎模型類的子類。例如:如何根據其類型爲模型的每個不同的子類分配不同的模板

class A(Model): 
    pass 

class B(A): 
    pass 

class C(A): 
    pass 

例如在網上購物我會EbookCDBall。我可以創建OneToOneOneToOneField的關係,但我認爲在這種情況下,用戶必須填寫兩種表單,首先他可以填寫產品字段,然後填寫表單,如電子書字段。 此外,我想顯示在數據庫中的產品,天氣它是電子書或電影或CD播放器或任何其他類型,被列在產品列表中。 所以我決定用這種方式創建模型。 問題在於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 }) 
+0

我可能會將它們添加爲類的屬性。我不確定django模型如何工作,但在App Engine模型中,它們需要以'_'作爲前綴。例如'_formObject = EbookForm' – mgilson

+0

當我看到這個:'product.getType()=='Ebook''時,我的眼睛流血了。 Python不是Java ... http://dirtsimple.org/2004/12/python-is-not-java.html – Oz123

+0

@ Oz123我剛讀過那篇文章,發現爲什麼'getType()'惱了你。對不起,關於這一點:D,因爲我說我是新的Python的 –

回答

1

你可以擺脫所有的if語句的,如果你在你的模型存儲模板的名稱,這樣你就可以叫render(request, product.template, {'form': form})

所以,你將有一個叫CharFieldtemplateProduct模式,你會與「書」,「電子書」填充等

這背後的原理被稱爲「replace conditional with polymorphism」。

您還應該考慮使用抽象基本模型,這對性能更好。

+0

謝謝。我想過在模型中存儲模板名稱,但對我來說,這是一件很奇怪的事情,我認爲在模型中放置一個與Django相關的視圖(模板)信息違反了最佳實踐規則 –

相關問題