django: form_valid () отсутствует 1 обязательный позиционный аргумент: 'form' - PullRequest
0 голосов
/ 22 ноября 2018

Мне интересно, как я могу решить эту проблему в моей функции form_valid():

form_valid () отсутствует 1 обязательный позиционный аргумент: 'form'

Я использую Django Class Based View и formsets.Но можно получить 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(), чтобы решить мою проблему и перенаправить пользователя в той же форме шаблона с сообщением об ошибке.

Спасибо

1 Ответ

0 голосов
/ 22 ноября 2018

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(): aво второй раз, поскольку это уже определено - следовательно, выполняется form_valid.

...