【问题标题】:Models duplicating on save instead of updating模型在保存时复制而不是更新
【发布时间】:2009-08-21 00:52:57
【问题描述】:

我正在尝试制作一个 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', )

【问题讨论】:

  • 你没有对重写 save() 方法感到困惑吗?如果是,显示表单定义
  • 不,save() 没有改变。如果这会有所作为,我已经覆盖了 clean()?
  • 不是,除非您有可能清除了主键值。如果它在验证过程中丢失了 pk,它将创建另一个实例。

标签: django django-models django-forms


【解决方案1】:

在模型表单中覆盖 clean() 时,您必须授予对实例的访问权限,因此它丢失了我在 cmets 中所说的 PK,然后 save() 的结果是插入。

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

覆盖 clean() 方法¶

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

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

默认情况下 clean() 方法 验证字段的唯一性 被标记为独特的, unique_together 或 unique_for_date|month|year on the 模型。因此,如果您想 覆盖 clean() 方法和 保持默认验证,你 必须调用父类的 clean() 方法。

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

【讨论】:

  • 感谢您的帮助。 :) 我设法用这个答案将问题追溯到自定义日期小部件。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多