2009-12-10 10 views
5

EventSeriesという2つのモデルがあります。各イベントはSeriesに属しています。ほとんどの場合、イベントのstart_timeはシリーズ 'default_timeと同じです。Django管理者の親モデルに基づいてインラインを事前投入

ここでは、モデルを削除しています。

#models.py 

class Series(models.Model): 
    name = models.CharField(max_length=50) 
    default_time = models.TimeField() 

class Event(models.Model): 
    name = models.CharField(max_length=50) 
    date = models.DateField() 
    start_time = models.TimeField() 
    series = models.ForeignKey(Series) 

私は管理アプリケーションでインラインを使用しているので、シリーズのすべてのイベントを一度に編集できます。

シリーズが既に作成されている場合は、シリーズ 'default_timeでインラインイベントごとにstart_timeを事前入力します。これまでのところ、Eventのモデル管理フォームを作成し、initialオプションを使用して、固定時間で時間フィールドを事前入力しました。

#admin.py 
... 
import datetime 

class OEventInlineAdminForm(forms.ModelForm): 
    start_time = forms.TimeField(initial=datetime.time(18,30,00)) 
    class Meta: 
     model = OEvent 

class EventInline(admin.TabularInline): 
    form = EventInlineAdminForm 
    model = Event 

class SeriesAdmin(admin.ModelAdmin): 
    inlines = [EventInline,] 

ここから進める方法はわかりません。 start_timeフィールドの初期値がSeries 'default_timeであるように、コードを拡張することは可能ですか?

+0

これを参照してください:http://stackoverflow.com/questions/442040/pre-populate-an-inline-formset –

答えて

0

私はあなたがModelAdminの上で機能をクローズする必要があると思う:

ここ
def create_event_form(series): 
    class EventForm(forms.ModelForm): 
     def __init__(self, *args, **kwargs): 
      # You can use the outer function's 'series' here 
    return EventForm 

シリーズはseriesインスタンスになります。 はその後インラインadminクラスに:

class EventInlineAdmin(admin.TabularInline): 
    model = Event 
    def get_formset(self, request, obj=None, **kwargs): 
     if obj: 
      self.form = create_foo_form(obj) 
     return super(EventInlineAdmin, self).get_formset(request, obj, **kwargs) 

EDIT:このアプローチは、あなたのフィールドのデフォルトを設定するためにそれを使用することができますフォームにごseriesオブジェクトを渡すことができます。

+0

申し訳ありませんが、私は答えを理解していません。どこでcreate_foo_form関数をDjango管理者にフックしますか? – Alasdair

+0

adminモジュールのmodeladminクラスの前のどこかに関数を作成するだけです。 – shanyu

+0

私は自分の答えを詳述しようとしましたが、今度は助けてくれるといいと思います。 – shanyu

関連する問題