2009-08-21 66 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 2009-08-21 04:20:28

+0

否,save()未觸及。我已經重寫了clean(),如果這會有所作爲? – xoebus 2009-08-21 07:02:06

+0

不是,除非有清除主鍵值的可能性。如果在驗證過程中丟失了pk,它將創建另一個實例。 – zalew 2009-08-21 08:56:36

回答

2

覆蓋清潔時,()在modelformsü必須給訪問實例,因此它失去了PK,因爲我在評論中說,然後保存的(結果)是插入。

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

重寫潔()method¶

您可以覆蓋乾淨()方法 模式的形式,以同樣的方式,你可以提供額外的 驗證上 正常形成。

默認情況下,清潔()方法 驗證字段 的被標記爲唯一的唯一性, unique_together或 unique_for_date:

在這點上,相比 到表單時模型形式有兩個 特定特性月|年| 模型。因此,如果您想 覆蓋clean()方法並且 保持默認驗證,您必須調用父類的clean() 方法。

此外,模型表單實例綁定到 模型對象將包含 self.instance屬性給出 模型形式的方法訪問該特定 模型實例。

+0

感謝您的幫助。 :)我設法跟蹤這個問題到自定義日期小部件與這個答案。非常感謝! – xoebus 2009-08-21 10:55:14

相關問題