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
а задумка была проверять если формы валидны, на пример если вдруг забыли выбрать какой то радиобутон или ....
но вопрос в том почему эти методы не срабатывают??
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 7:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 6:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 6:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-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 или редирект=)
если очень упрощенно и почти псевдокодом:
понятно
спасибо