私が書いているアプリケーションには、イベントを作成するためのパイプラインが含まれています。あるEvent
クラスのユーザーによって提案され、管理者によって承認および編集されます。私にとっての問題は、管理者がオンザフライで指定できるはずのEvent
、のサブクラスがあることです。ScoredEvent
これにより、ScoredEvent.competition
外部キーが追加Event.participants
され、各参加者に関連付けられたスコアを含むテーブルにそれらを配置するためにオーバーライドされます。
理想的には、通常のユーザーが名前と簡単な説明のみを含むイベントを作成し(管理者以外のCreateEventFormのフィールドを制限することで簡単に作成できます)、管理者は承認時に他のフィールドに戻って入力できます。イベント。
私が直面している問題は、管理者が編集中に承認フォームビューでをに変更する方法や、それを実現する方法がわからないことですEvent
。ScoredEvent
このページの私のビジョンは、「Tie ToCompetition」というラベルの付いたチェックボックスを備えた編集ビューです。このチェックボックスをオンにすると、管理者はコンテストを選択して、イベントをとして保存できますScoredEvent
。そのボックスがチェックされていない場合、イベントはとして存続しEvent
ます。
これはどこで処理する必要がありますか?私の直感は、forms.pyで何か特別なことをしたり、テンプレートで何かをしたりする必要があるということですが、どこから始めればよいのかわかりません。
class Event(models.Model):
"""Representation of any community event"""
name = models.CharField(max_length=50, unique_for_date="start_datetime")
slug = models.SlugField(max_length=57) # length +7 for datestamp
description = models.TextField()
location = models.CharField(max_length=100, blank=True)
start_datetime = models.DateTimeField('Start', blank=True)
end_datetime = models.DateTimeField('End', blank=True)
participants = models.ManyToManyField(Participant)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)+'-'+datetime.now().strftime("%d%m%y")
super(Event, self).save(*args, **kwargs)
def __unicode__(self):
if self.start_datetime:
return "%s (%s)" % (self.name, self.start_datetime.date())
else:
return self.name
class ScoredEvent(Event):
"""Representation of an event that is tied to a competition"""
competition = models.ForeignKey(Competition)
participants = models.ManyToManyField(Participant, through="ScoredParticipant")
def is_scored(self):
"""Returns true if any of the participants has a score, else returns false"""
for participant in self.participants.objects.all():
if participant.score != 0:
return False
return True
class ScoredPartcipant(models.Model):
"""Participant and associated score for an event"""
participant = models.ForeignKey(Participant)
event = models.ForeignKey(ScoredEvent)
score = models.IntegerField(default=0)