我在我的Django項目中有一些模型是基礎模型類的子類。例如:如何根據其類型爲模型的每個不同的子類分配不同的模板
class A(Model):
pass
class B(A):
pass
class C(A):
pass
例如在網上購物我會Ebook
,CD
,Ball
。我可以創建OneToOne
與OneToOneField
的關係,但我認爲在這種情況下,用戶必須填寫兩種表單,首先他可以填寫產品字段,然後填寫表單,如電子書字段。 此外,我想顯示在數據庫中的產品,天氣它是電子書或電影或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 })
我可能會將它們添加爲類的屬性。我不確定django模型如何工作,但在App Engine模型中,它們需要以'_'作爲前綴。例如'_formObject = EbookForm' – mgilson
當我看到這個:'product.getType()=='Ebook''時,我的眼睛流血了。 Python不是Java ... http://dirtsimple.org/2004/12/python-is-not-java.html – Oz123
@ Oz123我剛讀過那篇文章,發現爲什麼'getType()'惱了你。對不起,關於這一點:D,因爲我說我是新的Python的 –