u
Oct. 30, 2020, 3:52 p.m.

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

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

forms.py

  1. class PostForm(forms.ModelForm):
  2. condition = forms.ChoiceField(widget=forms.RadioSelect, choices=CONDITION_CHOICES, label='Состояние', required=True)
  3. category = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'10'}), queryset=Category.objects.all(), empty_label=None, label='Категория', required=True)
  4. subcategory1 = forms.ModelChoiceField(queryset=Subcategory1.objects.all(), required=True)
  5. subcategory2 = forms.ModelChoiceField(queryset=Subcategory2.objects.all(), required=True)
  6.  
  7. class Meta:
  8. model = Advert
  9. fields = ('condition', 'title', 'description', 'category', 'subcategory1', 'subcategory2')

views.py

  1. class PostCreateView(UpdateView):
  2. model = Post
  3. form_class = PostForm
  4. template_name = 'add.html'
  5.  
  6. def get(self, request, *args, **kwargs):
  7. self.object = self.get_object()
  8. form_class = self.get_form_class()
  9. form = self.get_form(form_class)
  10. return self.render_to_response(self.get_context_data(form=form))
  11.  
  12. def post(self, request, *args, **kwargs):
  13. self.object = self.get_object()
  14. form = self.get_form()
  15.  
  16. #если нажимается кнопка draft
  17. if request.POST['submit']=='draft':
  18. form.instance.is_draft = 'True'
  19. self.object = form.save()
  20. return super().form_valid(form)
  21. else:
  22. pass
  23.  
  24. return super().post(request, *args, **kwargs)
  25.  
  26.  
  27.  
  28. def form_valid(self, form):
  29. form.instance.user = self.request.user
  30. self.object = form.save()
  31. return super().form_valid(form)
  32.  
  33.  
  34.  
  35. def get_success_url(self):
  36. return reverse('index')

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

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

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

2

Do you like it? Share on social networks!

7
Илья Чичак
  • Oct. 30, 2020, 4:01 p.m.

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

  1. def clean(self):
  2. cleaned_data = super().clean()
  3. if 'add' in self.data:
  4. ... дополнительные проверки(что поля есть и все, что надо проверить дополнительно)
  5. return cleaned_data
    u
    • Oct. 30, 2020, 6:56 p.m.

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

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

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

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

      u
      • Oct. 30, 2020, 7:31 p.m.
      • (edited)

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

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

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

      1. def post(self, request, *args, **kwargs):
      2. self.object = self.get_object()
      3. form = self.get_form()
      4.  
      5. #если нажимается кнопка draft
      6. if request.POST['submit']=='draft':
      7. form.instance.is_draft = 'True'
      8. self.object = form.save() #<-------------------- вот сюда бросает
      9. return super().form_valid(form)
      10. else:
      11. pass
      12.  
      13. return super().post(request, *args, **kwargs)
        Илья Чичак
        • Oct. 31, 2020, 3:39 p.m.

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

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

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

          u
          • Oct. 31, 2020, 4 p.m.

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

            Илья Чичак
            • Oct. 31, 2020, 4:57 p.m.
            • (edited)
            • The answer was marked as a solution.

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

              u
              • Oct. 31, 2020, 5:05 p.m.

              Спасибо

                Comments

                Only authorized users can post comments.
                Please, Log in or Sign up
                • Last comments
                • AK
                  April 1, 2025, 11:41 a.m.
                  Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                • Evgenii Legotckoi
                  March 9, 2025, 9:02 p.m.
                  К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                • VP
                  March 9, 2025, 4:14 p.m.
                  Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                • ИМ
                  Nov. 22, 2024, 9:51 p.m.
                  Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                • Evgenii Legotckoi
                  Oct. 31, 2024, 11:37 p.m.
                  Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup