MyForm(forms.Form): - непонятка
привет
уважаемые знатоки, может кто объяснить в чем проблема:
есть представление с двумя формами:
class MySettingsChangeView(LoginRequiredMixin, TemplateView): template_name = 'accounts/registration/settings_pass_status_change.html' def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) return render(request, self.template_name, context) def get_context_data(self, **kwargs): extra_context = None context = super().get_context_data(**kwargs) context.update({ 'pass_form': MyPasswordChangeForm, 'status_form': MyStatusChangeForm, **(self.extra_context or {}) }) return context def post(self, request): post_data = request.POST or None if 'pass' in self.request.POST: print(" srabotal pass") cont = self.request.POST elif 'status' in self.request.POST: if not request.user.is_active or not request.user.phone_active: return redirect('/') else: cont = self.request.POST try: new_status = cont['user_status'] except MultiValueDictKeyError: new_status = request.user.user_status curent_user = request.user.pk object = get_object_or_404(User, pk=curent_user) object.user_status = new_status object.save() return redirect('/dashboardc/home/')
вот формы:
class MyPasswordChangeForm(PasswordChangeForm): pass class MyStatusChangeForm(forms.Form): pass
форма MyStatusChangeForm состоит из 2 радио + сабмит
все работает гуд НО вся логика находится в представлении
я пытался в форме MyStatusChangeForm переопределить пару методов и для того чтобы понять что к ним стучатся написал по одному принту в теле НО такое осушение что все они в игноре, вот что я добавлял в класс формы:
def clean(self): print("in clean(self)") cleaned_data = super().clean() return cleaned_data def is_valid(self): print("in is_valid(self)") def clean_recipients(self): print("in clean_recipients(self)") data = super(MyStatusChangeForm, self).clean() return data
а задумка была проверять если формы валидны, на пример если вдруг забыли выбрать какой то радиобутон или ....
но вопрос в том почему эти методы не срабатывают??
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 12 листопада 2024 р. 02:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 12:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 12:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
1) что в шаблоне?
2) в определении контекста:
3) в методе post во вьюхе нет никакого использования форм, вот ничего и не происходит
4) зачем напрямую работать с данными из request.POST если можно в форме определить метод "save()" и дергать его или, на худой конец, работать с form.cleaned_data
5) я таки рекомендую разделить это на 2 вьюхи, чтобы каждая их них обрабатывала свою форму - меньше путаницы будет
вот шаблон: https://dpaste.org/PhjO
1) Почитайте про формы - многое, что у вас в шалобне определено, можно решить с помощью определения класса формы:
а работа с формой будет:
2) В шаблоне не используются формы из контекста. как вариант, что-то такое. Если используете bootstap - можно посмотреть на django-fancy-forms (или как-то так)
3) во вьюхе надо бы как-то с формой взаимодействовать:
выше пример, на изусть не помню - надо почитать доку
скажите пожалуйста а в чем смысл конструктора из формы:
просто в конструкторе self.user = None
последний вопрос снимаю
выдавал ошибку НО надо было в методе пост представления получить данные из формы вот так:
password_form = MyPasswordChangeForm1(user=request.user, data=request.POST or None)
т.е явно передать user=request.user
и все заработало
единственный вопрос остался, вы комент сделали, что в методе get_context_data из представления при добавлении форм в контекст, надо "# формы надо инициализировать"
вы имеите в виду это:
context.update({
'pass_form': MyPasswordChangeForm1(self.request.POST or None),
'status_form': MyStatusChangeForm1(self.request.POST or None)
})
если так, то нужна ли инициализация форм в контексте если в методе post того же представления рабораю с формой вот так:
password_form = MyPasswordChangeForm1(user=request.user, data=request.POST or None)
......
лично я бы сделал так:
в get_context_data я бы генерил основной контекст, в а методах get и post я бы уже добавлял туда формы, правильно инициализированные.
Т.е.
таким образом ошибки в форме правильно перенесутся в контектс и правильно можно будет их отобразить
решил я вроде мою задачу, только вот один баг есть и ни как не могу придумать как от него избавится.
вот мое решение:
баг в следующем: на хтмл странице 2 формы MyPasswordChangeForm1 , MyStatusChangeForm1
каждая из этих форм имеит свою собственную кнопку сaбмит
если я нажимаю на кнопку сабмит у любой формы НО без того чтобы заполнить форму (то есть формы невалидны) то появляются сообшения об ошибках над обеими формами а по моему мнению сообшение об ошибках должно появлятся только у той формы чей сабмит был нажат
может кто подсказать или направить как решить?
ну вообще, все логично.
Но чтобы они обрабатывались по отдельности - как я уже говорил в первом комменте, лучше было бы сделать 2 отдельные вьюхи. А у каждой формы в аттрибуте action должна быть своя вьюха. так получится и меньше сложность кода и тестируемость и все вот это
тоесть, получилось бы 3 вьюхи:
1. просто рендерит страницу + обратаывает только GET запрос
2. обрабатывает первую форму(вторую форму тоже рендерит без данных) + обрабатывает только POST запрос
3. обрабатывает вторую форму(первую рендерит без данных) + обрабатывает только POST запрос
кстати, не стоит переопределять метод is_valid() в формах
ведь метод is_valid() это метод форм
или вы намекаете что is_valid() можно в представлении переопределить? или его вообше не переопределять?
По документации, для дополнительных проверок надо использовать метод clean, is_valid - лучше не трогать
то есть вы советуете создать 2 пары:
1 пара => первая форма + отдельное представление (обработчик) для данной формы
2 пара => вторая форма + отдельное представление (обработчик) для данной формы
плюс к этому, третье представление с методом get куда я просто в context добавляю эти 2 формы
а уже в этих формах в атрибуте action указывать url путь из urls.py к соответствующему представлению которое отвечает за обработку данной формы
тогда я думаю что возникает вопрос-баг: если вдруг просто в браузере отрыть прямой url к одному из этих представлении что обрабатывают формы, что же будет происходить?
ну поставить заглушку на метод get или редирект=)
если очень упрощенно и почти псевдокодом:
понятно
спасибо