u
ubomj30 октября 2020 г. 5:52

Не проверять форму если нажали кнопку

Всем привет!
Имеем:

forms.py

class PostForm(forms.ModelForm):
    condition = forms.ChoiceField(widget=forms.RadioSelect, choices=CONDITION_CHOICES, label='Состояние', required=True)
    category = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'10'}), queryset=Category.objects.all(), empty_label=None, label='Категория', required=True)
    subcategory1 = forms.ModelChoiceField(queryset=Subcategory1.objects.all(), required=True)
    subcategory2 = forms.ModelChoiceField(queryset=Subcategory2.objects.all(), required=True)

    class Meta:
        model = Advert
        fields = ('condition', 'title', 'description', 'category', 'subcategory1', 'subcategory2')

views.py

class PostCreateView(UpdateView):
    model = Post
    form_class = PostForm
    template_name = 'add.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        return self.render_to_response(self.get_context_data(form=form))

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()

        #если нажимается кнопка draft
        if request.POST['submit']=='draft':
            form.instance.is_draft = 'True'
            self.object = form.save()
            return super().form_valid(form)
        else:
            pass

        return super().post(request, *args, **kwargs)



    def form_valid(self, form):
        form.instance.user = self.request.user
        self.object = form.save()
        return super().form_valid(form)



    def get_success_url(self):
        return reverse('index')

и шаблон с 2 кнопками

<button value="draft" type="submit" name="submit" class="button">Сохранить как черновик</button>
<button value="add" type="submit" name="submit" class="button">Добавить пост</button>

Как разобраться с проверками формы и сделать такое?:
если нажата кнопка draft -> не проверяем форму и просто сохраняем
если нажата кнопка add -> проверяем форму и сохраняем только после полного заполнения

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

7
Илья Чичак
  • 30 октября 2020 г. 6:01

можно указать все поля, как required=False, а в методе clean сделать:

def clean(self):
    cleaned_data = super().clean()
    if 'add' in self.data:
        ... дополнительные проверки(что поля есть и все, что надо проверить дополнительно)
    return cleaned_data
    u
    • 30 октября 2020 г. 8:56

    что то не выходит((
    попробовал вот так:

        def clean_title(self):
            title = self.cleaned_data.get('title')
            if 'title' in self.data:
                raise ValidationError("Title не заполнен")
            return title
    

    При клике на кнопку add выдает Title не заполнен , а если нажать на draft кнопку = The Post could not be changed because the data didn't validate. и подсвечивает строку во вьюшке (self.object = form.save())

    А пример дополнительной проверки можно?)) может я что то не то там пишу...

      u
      • 30 октября 2020 г. 9:31
      • (ред.)

      попробовал еще вот так:

          def clean(self):
              cleaned_data = super().clean()
              if 'add' in self.data:
                  if not self.data['title']:
                      raise forms.ValidationError(u'Обязательное поле')
      
              return cleaned_data
      

      Ничего не происходит, но если убрать (if 'add' in self.data:) получается как и выше... при клике на add выдает !Обязательное поле - как и надо , а если нажать на draft кнопку = The Post could not be changed because the data didn't validate. и бросает на ошибку во вьюшке

       def post(self, request, *args, **kwargs):
              self.object = self.get_object()
              form = self.get_form()
      
              #если нажимается кнопка draft
              if request.POST['submit']=='draft':
                  form.instance.is_draft = 'True'
                  self.object = form.save() #<-------------------- вот сюда бросает
                  return super().form_valid(form)
              else:
                  pass
      
              return super().post(request, *args, **kwargs)
      
        Илья Чичак
        • 31 октября 2020 г. 5:39

        Возможно, если загуглить ошибку "could not be changed because the data didn't validate", можно было бы найти страницу, которая говорит, что надо вызвать метод "is_valid()" у формы? у вас же валидация происходит после вызова "save()"

        Я бы посоветовал вам почитать документацию по формам Django - там есть ответы на большинство вопросов

        ну и пока рано использовать UpdateView - если у вас не стандартная логика работы, Generic представления скрывают множество нюансов своей работы. использование сущностей более высокого уровня абстракции без понимания того, что происходит на нижних уровнях черевато "непонятными ошибками"

          u
          • 31 октября 2020 г. 6:00

          А если не UpdateView, то что посоветуете?

            Илья Чичак
            • 31 октября 2020 г. 6:57
            • (ред.)
            • Ответ был помечен как решение.

            я бы посоветовал начать с функцией, потом классы (просто View), а потом, когда возникнет понимание, какие участки кода повторяются, можно переходить к Generic View.
            generic view по сути просто View, в котором уже реализован тот код, который приходится писать каждый раз.

              u
              • 31 октября 2020 г. 7:05

              Спасибо

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                d
                • dsfs
                • 26 апреля 2024 г. 4:56

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:80баллов,
                • Очки рейтинга4
                d
                • dsfs
                • 26 апреля 2024 г. 4:45

                C++ - Тест 002. Константы

                • Результат:50баллов,
                • Очки рейтинга-4
                d
                • dsfs
                • 26 апреля 2024 г. 4:35

                C++ - Тест 001. Первая программа и типы данных

                • Результат:73баллов,
                • Очки рейтинга1
                Последние комментарии
                k
                kmssr8 февраля 2024 г. 18:43
                Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                АК
                Анатолий Кононенко5 февраля 2024 г. 1:50
                Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                EVA
                EVA25 декабря 2023 г. 10:30
                Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                J
                JonnyJo25 декабря 2023 г. 8:38
                Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                G
                Gvozdik18 декабря 2023 г. 21:01
                Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                Сейчас обсуждают на форуме
                G
                Gar22 апреля 2024 г. 5:46
                Clipboard Как скопировать окно целиком в clipb?
                DA
                Dr Gangil Academics20 апреля 2024 г. 7:45
                Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                a
                a_vlasov14 апреля 2024 г. 6:41
                Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                Павел Дорофеев
                Павел Дорофеев14 апреля 2024 г. 2:35
                QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                f
                fastrex4 апреля 2024 г. 4:47
                Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                Следите за нами в социальных сетях