かなり一般的なモデルを含むDjangoアプリケーションがあります:UserProfile
とOrganization
。AUserProfile
またはanOrganization
は両方とも0からnの電子メールを持つことができるので、私は。Email
を持つモデルを持っていGenericForeignKey
ます。 UserProfile
およびOrganization
モデルには両方とも、モデルを指すGenericRelation
呼び出しがあります(以下に要約コードを提供します)。emails
Email
質問Organization
:ユーザーが0からn個の電子メールアドレスを含む組織の詳細を入力できるフォームを提供するための最良の方法は何ですか?
私のOrganization
作成ビューはDjangoクラスベースのビューです。私は動的フォームを作成し、Javascriptでそれを有効にして、ユーザーが必要な数の電子メールアドレスを追加できるようにすることに傾倒しています。Twitter Bootstrapを使用してサイトに表示するために、django-crispy-formsとdjango-floppyformsを使用してフォームをレンダリングします。
フォームに埋め込まれた状態でこれを行うことを考えましたBaseGenericInlineFormset
が、これは電子メールアドレスにとってはやり過ぎのようです。クラスベースのビューによって提供されるフォームにフォームセットを埋め込むのも面倒です。
Organization
フィールドphone_numbers
と。でも同じ問題が発生することに注意してくださいlocations
。
コード
emails.py:
from django.db import models
from parent_mixins import Parent_Mixin
class Email(Parent_Mixin,models.Model):
email_type = models.CharField(blank=True,max_length=100,null=True,default=None,verbose_name='Email Type')
email = models.EmailField()
class Meta:
app_label = 'core'
Organizations.py:
from emails import Email
from locations import Location
from phone_numbers import Phone_Number
from django.contrib.contenttypes import generic
from django.db import models
class Organization(models.Model):
active = models.BooleanField()
duns_number = models.CharField(blank=True,default=None,null=True,max_length=9) # need to validate this
emails = generic.GenericRelation(Email,content_type_field='parent_type',object_id_field='parent_id')
legal_name = models.CharField(blank=True,default=None,null=True,max_length=200)
locations = generic.GenericRelation(Location,content_type_field='parent_type',object_id_field='parent_id')
name = models.CharField(blank=True,default=None,null=True,max_length=200)
organization_group = models.CharField(blank=True,default=None,null=True,max_length=200)
organization_type = models.CharField(blank=True,default=None,null=True,max_length=200)
phone_numbers = generic.GenericRelation(Phone_Number,content_type_field='parent_type',object_id_field='parent_id')
taxpayer_id_number = models.CharField(blank=True,default=None,null=True,max_length=9) # need to validate this
class Meta:
app_label = 'core'
parent_mixins.py
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.db import models
class Parent_Mixin(models.Model):
parent_type = models.ForeignKey(ContentType,blank=True,null=True)
parent_id = models.PositiveIntegerField(blank=True,null=True)
parent = generic.GenericForeignKey('parent_type', 'parent_id')
class Meta:
abstract = True
app_label = 'core'