1

最近、データベースをモデル継承構造に移動しています。ここに例があります:

タスクモデル

STATUS_CHOISE = (('PR', 'In process'), ('ST', 'Stopped'), ('FN', 'Finished'), ('DL', 'Deleted'),)
class Task(models.Model):
    owner = models.ForeignKey(User)
    process = models.ForeignKey(Process)
    title = models.CharField(max_length=200, default='')
    description = models.CharField(max_length=1000, default='')
    date_created = models.TimeField(auto_now_add=True, auto_now=False) 
    date_deadline = models.DateTimeField(default=lambda: (datetime.now() + timedelta(days=7)), auto_now_add=False)
    parameters = jsonfield.JSONField()
    objects = InheritanceManager()
    status = models.CharField(max_length=2, choices=STATUS_CHOISE, default='ST')

ここでは Task を拡張する HumanTask

PLATFORMS = (('CC', 'CrowdComputer'), ('MT', 'Amazon Mechancial Turk'),)
class HumanTask(Task):
    number_of_instances = models.IntegerField(default=1)
    uuid = models.CharField(max_length=36, default='')
    page_url = models.URLField(max_length=400, default='', null=True, blank=True)
    platform = models.CharField(max_length=2,choices=PLATFORMS, default='CroCo')
    validation=models.OneToOneField(ValidationTask)
    reward = models.OneToOneField(Reward, null=True, blank=True)

さて、どのようにフォームを作成すればよいでしょうか? 両方のクラスに ModelForm を使用する必要がありますか? 要点: しなければならないフィールドがあるexclude

たとえば、TaskForm は次のとおりです。

class TaskForm(ModelForm):
    owner = forms.ModelChoiceField(queryset=User.objects.all(),widget=forms.HiddenInput)
    process = forms.ModelChoiceField(queryset=Process.objects.all(),widget=forms.HiddenInput)

    class Meta:
        model = Task
        exclude = ('date_deadline', 'date_created','parameters','status','objects')

だから私が欲しいのHumanTaskFormは、除外がTaskForm 私がこれで試したものから継承されていることです

class HumanTaskForm(TaskForm):
    class Meta:
        model= HumanTask
        exclude = 'uuid'

しかし、動作しません。

まとめ:これは正しいですか?フォームに継承を使用する必要がありますか? また、フィールドやその他のパラメーター、継承を除外するにはどうすればよいですか?

4

2 に答える 2

1

親メタも継承する必要があります。

子クラスは親 Meta クラスを継承/コピーします。子メタで明示的に設定された属性は、継承されたバージョンをオーバーライドします。私の知る限り、親のメタ属性を拡張する (つまり、「除外」に追加する) 方法はありません。

class AwesomeForm(forms.ModelForm):
    class Meta:
        model = AwesomeModel
        exclude = ('title', )

class BrilliantForm(AwesomeForm)
    class Meta(AwesomeForm):
        model = BrilliantModel

.

print(AwesomeForm.Meta.model)
> AwesomeModel

print(BrilliantForm.Meta.model)
> BrilliantModel

print(AwesomeForm.Meta.exclude)
> ('title', )

print(BrilliantForm.Meta.exclude)
> ('title', )

次のようなことができます。

class BrilliantForm(AwesomeForm)
    class Meta(AwesomeForm):
        model = BrilliantModel
        exclude = AwesomeForm.Meta.exclude + ('uuid', )

.

print(BrilliantForm.Meta.exclude)
> ('title', 'uuid')
于 2013-05-24T13:12:01.787 に答える
1

excludefromを活用TaskFormして拡張したい場合はHumanTaskForm、TaskForm から Meta クラスを継承できます。

class HumanTaskForm(TaskForm):
    class Meta(TaskForm.Meta):
        model = HumanTask
        exclude = TaskForm.Meta.exclude + ('uuid',)
于 2013-05-24T13:10:32.833 に答える