2009-08-21 7 views
1

イベントを処理するDjangoアプリケーションを作成しようとしています。以下のビューは、すでに作成されたイベントの編集を処理します。新しいイベントが行われた変更を使用して作成されている間、既存のイベントが既存のイベントを編集する更新の代わりに保存時にモデルが複製される

@login_required 
def event_admin(request, event_id): 
    event = get_object_or_404(Event, pk=event_id) 

    if request.method == 'POST' and request.user == event.organiser: 
     event_form = EventAdminForm(request.POST, instance=event) 

     if event_form.is_valid(): 
      event_form.save() 

      return HttpResponseRedirect(reverse('event_event_detail', 
       args=(event.id,))) 

    elif request.user == event.organiser: 
     event_form = EventAdminForm(instance=event) 

     return render_to_response('events/event_admin.html', 
      {'event_form': event_form, 'event': event}, 
      context_instance = RequestContext(request)) 

    return HttpResponseRedirect(reverse('event_event_detail', args=(event.id,))) 

がそのまま残されています。誰かが私が間違っていることを見ることができますか?どうもありがとう。

編集:

ここは、役立つ場合はforms.pyの関連セクションです。

class EventAdminForm(ModelForm): 
    start_time = forms.DateTimeField(widget=SplitSelectDateTimeWidget(
     minute_step=5, second_step=60, years=range(2009, 2015)), 
     initial=datetime.datetime.now()) 

    end_time = forms.DateTimeField(widget=SplitSelectDateTimeWidget(
     minute_step=5, second_step=60, years=range(2009, 2015)), 
     initial=datetime.datetime.now()) 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     start_time = cleaned_data.get('start_time') 
     end_time = cleaned_data.get('end_time') 

     # The start of an event cannot be after the end. 
     if start_time > end_time: 
      raise forms.ValidationError(u'The end of an event can not be before the start.') 

     return cleaned_data 

    class Meta: 
     model = Event 
     exclude = ('attendees', 'organiser',) 
+1

save()メソッドをオーバーライドしていませんか?はいの場合は、フォーム定義 – zalew

+0

を表示します。いいえ、save()は変更されません。違いがあればclean()をオーバーライドしましたか? – xoebus

+0

は、プライマリキー値を消去した可能性がない限り、使用できません。検証中にpkが失われた場合、別のインスタンスが作成されます。 – zalew

答えて

2

クリーンをオーバーライド()modelformsに)uが、インスタンスへのアクセス権を与える必要があり、それは私がコメントで言ったようにPKを失った後、(セーブの結果インサートです。 )(クリーンをオーバーライド

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

は 通常に同じ方法することができますに追加 検証を提供するために

あなたは モデルフォームにクリーン()メソッドをオーバーライドすることができ

をmethod¶形。この点に関して

形態に を比較した場合、モデルの形態は、2つの 特定の特性を有する:

デフォルトでクリーン()メソッド が一意、 unique_together又は unique_for_dateとしてマークされたフィールド の一意性を検証します|月|年の モデルです。したがって、 にclean()メソッドをオーバーライドし、 がデフォルトの検証を維持する場合は、 は親クラスのclean() メソッドを呼び出す必要があります。

また、 モデルオブジェクトにバインドされたモデルのフォームインスタンスは モデルフォームメソッドにその 特定のモデルインスタンスへのアクセスを提供します self.instance属性が含まれます。

+0

あなたの助けをありがとう。 :)私は、この回答でカスタム日付ウィジェットの問題を追跡することができました。どうもありがとう! – xoebus

関連する問題