-
Notifications
You must be signed in to change notification settings - Fork 0
/
view.py
79 lines (59 loc) · 2.67 KB
/
view.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect
from django.views.generic import TemplateView
from django.forms.formsets import all_valid
class FormsView(TemplateView):
"""
Позволяет работать с набором форм.
form_class_dict - словарь, в котором ключ-префикс, значение-форма или формсет.
instance_dict - словарь instance для форм, в котором ключ-префикс, значение-instance.
Если instance_dict не содержит instance для формы, то в качестве instance будет использован
результат метода get_object.
"""
form_class_dict = {}
instance_dict = {}
success_url = None
def get_form_class_dict(self):
return self.form_class_dict.copy()
def get_form_class(self, key):
return self.get_form_class_dict()[key]
def get_instance_dict(self):
return self.instance_dict.copy()
def get_object(self):
return None
def get_instance(self, key):
return self.get_instance_dict().get(key, self.get_object())
def get_kwargs_form(self, key, **kwargs):
kwargs.update({'instance':self.get_instance(key), 'prefix':key})
if self.request.method in ('POST', 'PUT'):
kwargs.update({
'data': self.request.POST,
'files': self.request.FILES,
})
return kwargs
def get_form(self, key, **kwargs):
class_ = self.get_form_class(key)
return class_(**self.get_kwargs_form(key, **kwargs))
def get_success_url(self):
return self.success_url
def get(self, request, *args, **kwargs):
context = self.get_context_data(objects=self.get_instance_dict())
for key in self.get_form_class_dict().keys():
context[key] = self.get_form(key)
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
forms = {}
for key in self.get_form_class_dict().keys():
forms[key] = self.get_form(key)
if all_valid(forms.values()):
return self.form_valid(forms)
else:
return self.form_invalid(forms)
def form_valid(self, forms):
for key, value in forms.items():
value.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, forms):
context = self.get_context_data(objects=self.get_instance_dict())
context.update(**forms)
return self.render_to_response(context)