0

私が書いているアプリケーションには、イベントを作成するためのパイプラインが含まれています。あるEventクラスのユーザーによって提案され、管理者によって承認および編集されます。私にとっての問題は、管理者がオンザフライで指定できるはずのEvent、のサブクラスがあることです。ScoredEventこれにより、ScoredEvent.competition外部キーが追加Event.participantsされ、各参加者に関連付けられたスコアを含むテーブルにそれらを配置するためにオーバーライドされます。

理想的には、通常のユーザーが名前と簡単な説明のみを含むイベントを作成し(管理者以外のCreateEventFormのフィールドを制限することで簡単に作成できます)、管理者は承認時に他のフィールドに戻って入力できます。イベント。

私が直面している問題は、管理者が編集中に承認フォームビューでをに変更する方法や、それを実現する方法がわからないことですEventScoredEventこのページの私のビジョンは、「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)
4

1 に答える 1

0

オーバーライドget_querysetして、フィールドの1つが投稿されているかどうかによって異なります。

def get_queryset(self):
    if self.request.POST.has_key('competition'):
        return ScoredEvent.objects.all()
    else:
        return super(MyView, self).get_queryset()

したがって、もう少し詳しく説明すると、前述の「競争に結び付ける」オプションを使用して、Javascriptを介してフォームにフィールドを追加します。次に、フィールドがPOSTで送信されると、ScoredEvent代わりに使用に切り替わります。

オブジェクトが現在何であるかに基づいて自動的に切り替える場合は、それをオーバーライドする必要がありますget_object。次のようなもの:

def get_object(self, queryset=None):
    obj = super(MyView, self).get_object(queryset=queryset)
    try:
        return ScoredEvent.objects.get(pk=obj.pk)
    except ScoredEvent.DoesNotExist:
        return obj

これは基本的に、オブジェクトをあたかもそれであるかのように再度ルックアップしようとし、オブジェクトがScoredEvent見つかった場合は、の代わりにそのバージョンを返しますEvent

また、同様にオーバーライドして、aまたは:になっている場合に必要なget_form_classものとして検証されるようにする必要がある場合もあります。ScoredEventScoredEventScoredEvent

from django.forms import models as model_forms

def get_form_class(self):
    if isinstance(self.object, ScoredEvent):
        return model_forms.modelform_factory(ScoredEvent, ScoredEventForm)
    else:
        return super(MyView, self).get_form_class()
于 2012-08-09T18:48:05.147 に答える