表单集:保存模型

2024-10-03 13:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

一整天都在努力工作。我有一个主要的模式是入门。一个条目可以包括几个班次。这是应用程序商店工作时间的一部分。以下是创建条目的视图:

class EntryCreateView(FormView):
    template_name = 'entry/create.html'
    form_class    = AddWorkDay
    success_url   = reverse_lazy('time_manager:index')

    def get(self, request, ordinal=None, *args, **kwargs):
        """ Initiates with a blank form or will populate the day field with the day represented by the passed
            ordinal. """
        if ordinal:
            day  = datetime.datetime.fromordinal(int(ordinal))
            form = AddWorkDay(initial={'day': day})
        else:
            form = AddWorkDay()
        formset = ShiftFormSet()

        return render(request, self.template_name, {'form': form, 'formset': formset})

    def post(self, request, ordinal=None, *args, **kwargs):
        form    = AddWorkDay(data=request.POST)
        formset = ShiftFormSet(data=request.POST)
        errors  = []
        shifts  = []

        if form.is_valid() and formset.is_valid():
            # Build entry.
            entry       = form.save(commit=False)
            entry.owner = request.user
            errors.extend(entry.validate(request.user))

            # Build shift.
            for form in formset:
                shift       = form.save(commit=False)
                shift.entry = entry
                shifts.append(shift)
                errors.extend(shift.validate(request.user))

            if len(errors) == 0:
                entry.save()
                for shift in shifts:
                    shift.save()
                return HttpResponseRedirect(reverse('time_manager:index'))

        return render(request, self.template_name, {'form': form, 'formset': formset, 'errors': errors, 'shifts': shifts, 'entry': entry})

当我试图用shift键输入一个条目并按save时,它会终止并显示: “IntegrityError at/time_manager/entry/create/ NOT NULL约束失败:shift_班次输入\u id". 我试图找出移位的错误,所以我注释了保存移位的块(从“if len(errors)”到“return HttpResponseRedirect.”),这样它就可以返回到表单中的视图了。然后我将{{shifts}}放入我的模板中,看看里面有什么。当我这样做时,它以“NoReverseMatch at/time\u manager/entry/create”结束/ 反转“edit”的参数“()”和关键字参数“{'pk”:未找到“}”。尝试了1个模式:['time_manager/entry/shift/edit/(?P(\d+)/$']”就好像我试图使用{%url%}标记引用一个不存在的视图。所以我猜我试图保存表单集的表单时出了问题。但是,我一遍又一遍地阅读django文档,这就是存储表单集表单的方法,不是吗?在


Tags: selfform表单shifttimerequestsavemanager
1条回答
网友
1楼 · 发布于 2024-10-03 13:22:33

好吧,带着一个全新的头脑,我看了看我的代码,然后我想到了。我想先确保条目和每个班次都是正确构建的,然后只有在它们不违反任何规则的情况下才保存它们。正如您在上面看到的:我用commit=False保存这两者。但这意味着条目还没有被分配主键。主键是我的shift模型上的ForeignKeyField需要什么。这就是Django未能保存它的原因。
我稍微改变了方法的顺序。工作代码如下:

def post(self, request, ordinal=None, *args, **kwargs):
    form    = AddWorkDay(data=request.POST)
    formset = ShiftFormSet(data=request.POST)
    errors  = []
    shifts  = []

    if form.is_valid() and formset.is_valid():
        # Build entry.
        entry       = form.save(commit=False)
        entry.owner = request.user
        errors.extend(entry.validate(request.user))

        # Build shift.
        for form in formset:
            shift       = form.save(commit=False)
            shifts.append(shift)
            errors.extend(shift.validate(request.user))

        # If there are no errors, save the entry ans it's shifts.
        if len(errors) == 0:
            entry.save()
            for shift in shifts:
                shift.entry = entry
                shift.save()
            return HttpResponseRedirect(reverse('time_manager:index'))

    return render(request, self.template_name, {'form': form, 'formset': formset, 'errors': errors, 'shifts': shifts, 'entry': entry})

请注意第二次保存条目(withoutcommit=False),然后将其分配给shift。在

相关问题 更多 >