模型在保存时重复而不是更新

时间:2009-08-21 00:52:58

标签: django django-models django-forms

我正在尝试创建一个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 个答案:

答案 0 :(得分:2)

当覆盖模型中的clean()时,你必须提供对实例的访问权限,所以它丢失了我在评论中所说的PK,然后save()的结果就是插入。

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

  

覆盖clean()方法¶

     

您可以覆盖clean()方法   提供额外的模型表格   以与您相同的方式进行验证   正常形式。

     

在这方面,模型形式有两个   比较时的具体特征   形式:

     

默认情况下为clean()方法   验证字段的唯一性   被标记为唯一的,   unique_together或   unique_for_date |月|年   模型。因此,如果你愿意的话   覆盖clean()方法和   保持默认验证,你   必须调用父类的clean()   方法

     

此外,模型表单实例绑定到   模型对象将包含一个   给出的self.instance属性   模型表单方法访问它   具体的模型实例。