Advertisement
DigitalMag

CustomModelForms

Jan 14th, 2019
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.64 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. from django import forms
  4. from django.core.validators import EmailValidator
  5. from django.core.exceptions import NON_FIELD_ERRORS
  6.  
  7. from main.models import Profile
  8.  
  9.  
  10. # для кастомного Field:
  11. from django.forms import BoundField, Field, ImageField
  12. from django.utils.translation import ugettext_lazy as _
  13. from django.utils.html import format_html
  14. from django.forms.utils import flatatt
  15. from django.utils.safestring import mark_safe
  16.  
  17. from django.middleware.csrf import get_token
  18.  
  19.  
  20. class ViewImageField(BoundField):
  21.    
  22.     def __init__(self, form, field, name, textvalue = 'textvalue', css_cls = 'upload_image'):              
  23.         if textvalue == 'textvalue': textvalue = 'Define ' + textvalue + ' in ' + self.__class__.__name__          
  24.         self.text = textvalue
  25.         self.css_class = 'class=' + css_cls    
  26.        
  27.         super(ViewImageField, self).__init__(form, field, name)
  28.    
  29.     def label_tag(self, contents=None, attrs=None, label_suffix=None):
  30.  
  31.         contents = contents or self.label
  32.         if label_suffix is None:
  33.             label_suffix = (self.field.label_suffix if self.field.label_suffix is not None
  34.                             else self.form.label_suffix)
  35.  
  36.         if label_suffix and contents and contents[-1] not in _(':?.!'):
  37.             contents = format_html(u'{}{}', contents, label_suffix)
  38.         widget = self.field.widget
  39.         id_ = widget.attrs.get('id') or self.auto_id
  40.         if id_:
  41.             id_for_label = widget.id_for_label(id_)
  42.             if id_for_label:
  43.                 attrs = dict(attrs or {}, **{'for': id_for_label})
  44.             if self.field.required and hasattr(self.form, 'required_css_class'):
  45.                 attrs = attrs or {}
  46.                 if 'class' in attrs:
  47.                     attrs['class'] += ' ' + self.form.required_css_class
  48.                 else:
  49.                     attrs['class'] = self.form.required_css_class
  50.             attrs = flatatt(attrs) if attrs else ''
  51.             contents = format_html(u'<label {}>{} <span {}>{}</span> </label>', attrs, contents, self.css_class, self.text)
  52.         else:
  53.             contents = conditional_escape(contents)
  54.         return mark_safe(contents)
  55.  
  56. class CustomImageField(ImageField):
  57.     """
  58.     отвечает за представление поля в шаблоне через методы класса BoundField, т.к.
  59.     BoundField - отвечает за представление поля в шаблоне
  60.     Нам надо переопределить label_tag, поэтому возвращаем свой класс BoundField с переопределенным методом label_tag
  61.    """
  62.     def get_bound_field(self, form, field_name):
  63.         return ViewImageField(form, self, field_name, "Выбрать") #css_cls =
  64.        
  65.     """
  66.     в конструкторе добавили поле parent - если он не None, тогда с него берем некоторые заданные параметры
  67.     """
  68.     def __init__(self,
  69.         parent = None,  #FileInput
  70.         required=True,
  71.         widget=None,
  72.         label=None,
  73.         initial=None,
  74.         help_text='',
  75.         error_messages=None,
  76.         show_hidden_initial=False,
  77.         validators=(),
  78.         localize=False,
  79.         disabled=False,
  80.         label_suffix=None):
  81.        
  82.         # если он не None, тогда с него берем некоторые заданные параметры
  83.         if parent:
  84.             label = parent.label
  85.             widget = parent.widget
  86.             self.textvalue = ''
  87.            
  88.         # так же надо задать некоторые параметры для label
  89.            
  90.         super(CustomImageField, self).__init__(
  91.                 required,
  92.                 widget,
  93.                 label,
  94.                 initial,
  95.                 help_text,
  96.                 error_messages,
  97.                 show_hidden_initial,
  98.                 validators,
  99.                 localize,
  100.                 disabled,
  101.                 label_suffix)
  102.  
  103. class CreatePersonHTML(forms.ModelForm):    
  104.    
  105.     def __init__(self, sub = 'def', cssclass = '',*args, **kwargs):        
  106.         super(CreatePersonHTML, self).__init__(*args, **kwargs)
  107.         self.request = kwargs.pop('request', None)
  108.         self.submit = sub
  109.         self.css_class = cssclass
  110.    
  111.     def as_h(self):
  112.        
  113.         csrf_t = 'None'
  114.         submit = self.submit
  115.         cssclass = format_html(u'class="{}"', self.css_class) if len(self.css_class) > 0 else ''
  116.        
  117.         if self.request != None:
  118.             csrf_t = '<input type="hidden" name="csrfmiddlewaretoken" value="' + get_token(self.request) + '">'
  119.         if self.submit == 'def':
  120.             submit = 'in_' + self.__class__.__name__ + '_notdefined'
  121.            
  122.         html = '<form method="post" '+ cssclass + '>' + csrf_t + self.as_p() + '<input type="submit" value=' + submit + '></form>'
  123.        
  124.         return mark_safe(html)
  125.        
  126.     def __unicode__(self):
  127.         return self.as_h()
  128.    
  129. class CreatePerson(CreatePersonHTML):
  130.     #required_css_class = 'required_fields'
  131.     error_css_class = 'error_class'     #работает, но не востребовано
  132.    
  133.     class Meta(object):
  134.  
  135.         model = Profile
  136.         fields =  ('username', 'password', 'first_name', 'last_name', 'email', 'City', 'Sex', 'Age', 'Image')       # exclude  
  137.         #exclude = ('username',)
  138.         labels = {
  139.             'username': 'Введите желаемый логин',
  140.             'password': 'Пароль',
  141.             'first_name': 'Имя',
  142.             'last_name': 'Фамилия либо Отчество',
  143.             'email': 'Почта',
  144.             'Image':'Изображение',
  145.         }      
  146.         help_texts = {
  147.             'username': (''),
  148.         }      
  149.         widgets = {
  150.             'password': forms.PasswordInput(attrs={'placeholder': u'Пароль'}),
  151.             'email': forms.EmailInput(attrs={'placeholder':'mail@example.ru'}),
  152.             'Image': forms.FileInput(
  153.                 attrs={
  154.                     'accept':"image/jpeg,image/png",
  155.                     'style':'visibility:hidden',
  156.                     'onchange': 'file_upload(this, event)'}),#'style':  display:none
  157.         }
  158.         error_messages = {
  159.             NON_FIELD_ERRORS: {
  160.                 'unique_together': "%(model_name)s's %(field_labels)s are not unique.",     #если нужны будут два уникальных поля
  161.             },
  162.             'username': {                
  163.                 'unique': u"Пользователь с таким именем уже существует",
  164.             },
  165.         }      
  166.    
  167.     def __init__(self, *args, **kwargs):        
  168.         super(CreatePerson, self).__init__(*args, **kwargs)
  169.         self.submit = u'Присоединиться'
  170.         self.css_class = ''
  171.        
  172.         self.fields['email'].validators=[EmailValidator(message="Некорректный адрес электронной почты")]  
  173.         self.fields['Image'] = CustomImageField(self.fields['Image'])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement