Django рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрди

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдбреЗрдЯрд╛ рд╕рдВрдкрд╛рджрди рдЙрдкрдХрд░рдг рджреЗрдирд╛ рдерд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ рдФрд░ рд╕рдВрдкрд╛рджрди рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рди рдХреВрджреЗрдВред рдереЛрдбрд╝рд╛ рдЧреБрдЧреНрд▓рд┐рдВрдЧ, рд╣рдордиреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ django-inplaceedit рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╛рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рджреГрд╢реНрдп рдбреЗрдЯрд╛ рд╕рдВрдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

PyPI рд╕реЗ рд╕реНрдерд╛рдкрдирд╛:

pip install django-inplaceedit 

рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 INSTALLED_APPS = ( .... 'inplaceeditform', ) 

 TEMPLATE_CONTEXT_PROCESSORS = ( #...# 'django.core.context_processors.request', #...# ) 


рдпреЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ
 ADAPTOR_INPLACEEDIT_EDIT = 'my_app.perms.MyAdaptorEditInline' # "  perms.py,  - " INPLACEEDIT_DISABLE_CLICK = False # "    Enter" THUMBNAIL_DEBUG = True INPLACEEDIT_EVENT = "click" # "   " 

рдЕрдкрдиреЗ рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдЧреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ред

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ? Django-inplaceedit , django-inplaceedit-extra-рдлрд╝реАрд▓реНрдб рдХреЛ AutoCompleteManyToManyField рдФрд░ AutoCompleteForeingKeyField рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдирд╛рдо рдореЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЖрдк рдЕрдкрдирд╛ рдПрдбреЙрдкреНрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
 ADAPTOR_INPLACEEDIT = {'auto_fk': 'inplaceeditform_extra_fields.fields.AdaptorAutoCompleteForeingKeyField', 'auto_m2m': 'inplaceeditform_extra_fields.fields.AdaptorAutoCompleteManyToManyField', 'image_thumb': 'inplaceeditform_extra_fields.fields.AdaptorImageThumbnailField', 'tiny': 'inplaceeditform_extra_fields.fields.AdaptorTinyMCEField',} 

Base.html рдореЗрдВ рдХрдиреЗрдХреНрд╢рди

 {% load inplace_edit %} {% inplace_toolbar %} or {% inplace_static %} 

Urls.py рдореЗрдВ рдХрдиреЗрдХреНрд╢рди

 urlpatterns = patterns('', #...# (r'^inplaceeditform/', include('inplaceeditform.urls')), #...# ) 

рдЕрдзрд┐рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╕рдВрдкрд╛рджрди


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рд╕реБрдкрд░рд╕реБрдЕрд░ django-inplaceedit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ
  ADAPTOR_INPLACEEDIT_EDIT = 'my_app.perms.MyAdaptorEditInline' 
рдЕрдм рдФрд░ред
My_app рдХреЗ рдЕрдВрджрд░ perms.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рдпрд╣рд╛рдБ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╣реИ
 class MyAdaptorEditInline(object): @classmethod def can_edit(cls, adaptor_field): user = adaptor_field.request.user obj = adaptor_field.obj can_edit = False if user.is_anonymous(): pass elif user.is_superuser: can_edit = True else: can_edit = has_permission(obj, user, 'edit') return can_edit 
рдореИрдВрдиреЗ рдЗрдирд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдЬрд╛рдВрдЪ рдХреА, рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдлрд╝рд╛рдЗрд▓ рд╕рд░рд▓ рд╣реИ
 class MyAdaptorEditInline(object): @classmethod def can_edit(cls, adaptor_field): can_edit = True return can_edit 


рдПрдбрд┐рдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 {% extends "base.html" %} {% load i18n inplace_edit %} ... <fieldset> <legend><span class="has-tip tip-top" data-width="300" title="     ."><wave class="social foundicon-torso"><p> </p></wave></span></legend> <ul class="square"> <li><p class="definition">: </p><p>{% inplace_edit "seeker.user.first_name" adaptor="tiny", auto_height=1, auto_width=1, edit_empty_value="  " %}</p></li> <li><p class="definition"> : </p><p>{% inplace_edit "seeker.age" adaptor="text", auto_height=1, auto_width=1, edit_empty_value="  " %}</p></li> <li><p class="definition"> : </p><p class="city">{% inplace_edit "seeker.city" adaptor="text", auto_height=1, auto_width=1, edit_empty_value="" %}</p></li> </ul> </fieldset> 

рдФрд░ рд╕рдВрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╕рдВрдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ:

рдЕрдм рдкреВрд░реЗ рдкреЗрдЬ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯред Textarea рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, WYSIWYG рд╕рдВрдкрд╛рджрдХ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛
рджреЗрдЦреЗрдВ:

рд╕рдВрдкрд╛рджрди рдореЛрдб рдореЗрдВ:

рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 {% inplace_edit "seeker.resume_workexp|safe" filters_to_show="safe", adaptor="tiny", tag_name_cover="div", auto_height=1, auto_width=1, edit_empty_value="  " %} 

рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдФрд░ рдПрдХ рд╣реА рдкреГрд╖реНрда рд╣реИ, рдмрд┐рдирд╛ рд░рд┐рдмреВрдЯ рдХреЗред рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рд╕рдВрдкрд╛рджрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЯреВрд▓рдЯрд┐рдкреНрд╕ рдереЗ рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗред

рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ


рдПрдХ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП image_thumb рдПрдбреЙрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ:
 TemplateSyntaxError at /adverts/cabinet/ Invalid block tag: 'endthumbnail', expected 'elif','else'  'endif' 

рдирд┐рд░реНрдгрдп

рддреНрд░реБрдЯрд┐ 'sorl.thumbnail' рдХреЗ рдХрд╛рд░рдг рд╣реИ рдЬреЛ django-inplaceedit-extra-field рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрди рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ django-inplaceedit-extra-рдлрд╝реАрд▓реНрдб рдорд┐рд▓реЗ рдЬрд╣рд╛рдВ рдкрд╣рд▓реА рдмрд╛рд░ sorl.thumbnail рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХреЙрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Django-inplaceedit-extra-field рдкреИрдХреЗрдЬ рдХреЗ рдлрд╝реАрд▓реНрдбрд╢реЛрдо рдХрд╛ рд╕рдВрдкрд╛рджрди, рд▓рд╛рдЗрди 96:
 from sorl import thumbnail #   from easy_thumbnails import thumbnail #    easy_thumbnails 

рдЬреАрдердм рдкрд░ рд▓рд┐рдВрдХ:
Django-inplaceedit
Django-inplaceedit-рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ

Source: https://habr.com/ru/post/In158155/


All Articles