4

一般的な関係として、さまざまなモデルで常に使用されている Phone モデルがあります。それらのモデルの作成/更新フォームにそれを含める方法がわかりません…forms.ModelFormサブクラスに追加のフィールドを含めることがどれほど良いか悪いか…次のようなものです:

###### models.py

class UpstreamContactModel(models.Model):
    client = models.ForeignKey(UpstreamClientModel,
            related_name='contacts')
    contact_type = models.CharField(max_length=50, default='Main', 
            blank=True, null=True)
    name = models.CharField(max_length=100, unique=True)
    job_title = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(blank=True, null=True)
    skype_id = models.CharField(max_length=30, blank=True, null=True)
    phones = generic.GenericRelation(Phone)
    notes = models.TextField(blank=True, null=True)

    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name = 'Contact'


class Phone(models.Model):
    info = models.CharField('Eg. Office, Personal, etc', 
            max_length=15, blank=True)
    number = models.CharField('Phone numbes', max_length=20)
    # generic relationships so I can attach to other objects later on
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    def __unicode__(self):
        return self.number


##### forms.py

class ContactForm(forms.ModelForm,  BaseValidationForm):
    info = forms.CharField(max_length=15)
    number = forms.CharField(max_length=20)

    class Meta:
        model = UpstreamContactModel

    def clean(self):
        ???

    def save(self):
        ???

一般的な関係が関係している場合に人々が CRUD をどのように処理するかを調べようとしていますが、これまでのところ成功していません。

4

1 に答える 1

1

モデルフォームを使用すると、それらが使用しているフォーム要素の種類を確認できます。

content_typeの場合、通常、クエリセットとしてContentType.objects.all()を指定したModelChoiceFieldを使用し、object_idは正の整数を検索するTextInputになります。モデルフォームを使用する場合、実際の汎用アクセサーがフォームに表示されるとは思いません。

これよりも洗練されたソリューションが必要な場合は、それを処理するためのカスタムフォームフィールドまたはウィジェットを作成することを検討します。

ModelFormにフィールドを追加するのは悪い習慣ではないと思います。実際、それは良い方法だと思います。saveメソッドをオーバーライドすると、おそらく必要な機能が得られます。

于 2013-01-09T16:48:09.610 に答える