Django では、動物が好きなアプリケーションからの抜粋を以下に示します。
以下の動物/models.py :
from django.db import models
from django.contrib.contenttypes.models import ContentType
class Animal(models.Model):
content_type = models.ForeignKey(ContentType,editable=False,null=True)
name = models.CharField()
class Dog(Animal):
is_lucky = models.BooleanField()
class Cat(Animal):
lives_left = models.IntegerField()
そしてanimal/urls.py :
from django.conf.urls.default import *
from animals.models import Animal, Dog, Cat
dict = { 'model' : Animal }
urlpatterns = (
url(r'^edit/(?P<object_id>\d+)$', 'create_update.update_object', dict),
)
一般的なビューを使用して、同じフォームを使用して犬や猫を編集するにはどうすればよいですか?
すなわち、 animals/animal_form.htmlに渡されるフォームオブジェクトはAnimal になるため、派生クラス Dog および Cat の詳細は含まれません。Django に子クラスのフォームをanimal/animals_form.htmlに自動的に渡すにはどうすればよいですか?
ちなみに、私はContentType の管理にDjangosnippets #1031を使用しているため、Animalには派生クラスを返すas_leaf_classという名前のメソッドがあります。
明らかに、派生クラスごとにフォームを作成することもできますが、それはかなりの不要な重複です (テンプレートはすべてジェネリックになるため、基本的には {{ form.as_p }})。
ちなみに、Animal はおそらく同じ問題を抱えたいくつかの無関係な基本クラスの 1 つであると想定するのが最善です。そのため、理想的な解決策はジェネリックです。
助けてくれてありがとう。