【问题标题】:django : form_valid() missing 1 required positional argument: 'form'django:form_valid() 缺少 1 个必需的位置参数:'form'
【发布时间】:2019-04-25 01:02:19
【问题描述】:

我想知道如何在我的 form_valid() 函数中解决这个问题:

form_valid() 缺少 1 个必需的位置参数:'form'

我正在使用Django Class Based Viewformsets。但是,有可能获得IntegrityError,我添加了try/except,以便在表单有效时保存表单集,并在遇到此问题时重定向模板并显示错误消息。

class AnimalCreateView(CreateView):
    model = Animal
    template_name = 'animal_form.html'

    def get_context_data(self, **kwargs):
        context = super(AnimalCreateView, self).get_context_data(**kwargs)
        foo_queryset = Foo.objects.all()
        context['FooFormSets'] = FooFormSet(self.request.POST or None, self.request.FILES or None,
                                                      prefix='foo', queryset=foo_queryset)
        return context

    def form_valid(self, request, form):
        context = self.get_context_data()
        formsets = context['FooFormSets']
        if form.is_valid():
            self.object = form.save()
            try:
                if formsets.is_valid():
                    formsets.instance = self.object
                    formsets.save(commit=False)
                    for element in formsets:
                        element.save(commit=False)
                        formsets.save()
            except IntegrityError:
                messages.error(self.request, _(f"Issue with foo"))
                return render(request, self.template_name)

        return super(AnimalCreateView, self).form_valid(form)

我想知道我必须在我的form_valid() 函数中做什么才能解决我的问题并将用户重定向到带有错误消息的同一模板表单上。

谢谢

【问题讨论】:

  • def form_valid(self, request, form): 应该是def form_valid(self, form):

标签: django django-templates django-views


【解决方案1】:

def form_valid(self, request, form): 应该是def form_valid(self, form):

您可以通过self.request访问请求对象。

def form_valid(self, form):
    context = self.get_context_data()
    formsets = context['FooFormSets']
    if form.is_valid():
        self.object = form.save()
        try:
            if formsets.is_valid():
                formsets.instance = self.object
                formsets.save(commit=False)
                for element in formsets:
                    element.save(commit=False)
                    formsets.save()
        except IntegrityError:
            messages.error(self.request, _(f"Issue with foo"))
            return render(self.request, self.template_name)

此外,您不需要再次调用 if form.is_valid():,因为这已经确定 - 因此执行 form_valid

【讨论】:

  • 是的,你是对的!我还有一个问题,我必须更换except IntegrityError 还是很好?因为formsets.save() 是引发后续异常的直接原因。
  • 如果您期待IntegrityError,那么它不会受到伤害,但是如果没有关于您的模型的更多信息,我不知道。例如,如果您的外键是 OneToOneField,则重复键可能会导致错误
  • 我会根据我的IntegrityError创建一个新问题谢谢!
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2017-03-27
相关资源
最近更新 更多