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

              Спасибо

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                AD

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

                • Результат:50баллов,
                • Очки рейтинга-4
                m
                • molni99
                • 26 октября 2024 г. 11:37

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

                • Результат:80баллов,
                • Очки рейтинга4
                m
                • molni99
                • 26 октября 2024 г. 11:29

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

                • Результат:20баллов,
                • Очки рейтинга-10
                Последние комментарии
                i
                innorwall12 ноября 2024 г. 9:12
                Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                i
                innorwall12 ноября 2024 г. 5:23
                QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                i
                innorwall12 ноября 2024 г. 2:50
                Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                i
                innorwall12 ноября 2024 г. 1:19
                Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                i
                innorwall12 ноября 2024 г. 0:55
                PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                Сейчас обсуждают на форуме
                i
                innorwall12 ноября 2024 г. 7:56
                добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                i
                innorwall11 ноября 2024 г. 21:55
                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                9
                9Anonim25 октября 2024 г. 19:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                ИМ
                Игорь Максимов3 октября 2024 г. 14:05
                Реализация навигации по разделам Спасибо Евгений!

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