
Django рдорд╣рд╛рди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ: рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ Django рдХреЗ рдЖрдЧрдорди рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрднреА рднреА рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдкрд┐рдЫрд▓реЗ рд╕рд╛рдврд╝реЗ рдЪрд╛рд░ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ Django рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рд╕рдордп Django рдмреЗрд╣рддрд░ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ рднреА рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ - рдЖрдк Django рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдЯрд╛рдХреЗрд╡рд░рдлреНрд▓реЛ рдкрд░ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ (рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпреЛрдВ, рд╕рд╛рде рд╣реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Trac, рдЕрдХреНрд╕рд░ рдорджрдж) рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдПрдХ рд╕рд╛рдеред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рдХреНрдпрд╛-рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВ, рдЬреЛ (рдЕрднреА рддрдХ) рдЖрдкрдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдирд╣реАрдВ рдкрдврд╝реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ - рд▓рд┐рдЦреЛ, рд╢рд╛рдпрдж рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реИред
1. рд╕рднреА рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди (рдЬрдм рдПрдХ рдкреГрд╖реНрда рдкрд░ рдлрд┐рдЯ рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ) рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрдареЛрдВ (рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрдареЛрдВ) рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдПрдбрдорд┐рди рдПрдХреНрд╢рди) рдХреА рдХреНрд░рд┐рдпрд╛рдПрдВредрдХреНрдпрд╛ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рд╣реИрдВ? рдХреНрдпрд╛ рд╡реЗ рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреА рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ):
selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
рдлрд┐рд░ рдЖрдк рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ 100 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП (рдпрджрд┐ рдкреГрд╖реНрда рдкрд░ 100 рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), рдФрд░ рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрда рдкрд░ рдПрдХ рдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЫрд┐рдкреЗ рд╣реБрдП рдлрд╝реАрд▓реНрдб ("_selected_action") рд╣реЛрддреЗ рд╣реИрдВред
рд╡рд╣ рд╣реИ (ModelAdmin рдореЗрдВ):
class AssignBooksForm(forms.Form): _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) user = forms.ModelChoiceField(queryset=User.objects.all(), label=u"", empty_label=None) def assign_books(self, request, queryset): form = None if 'cancel' in request.POST: self.message_user(request, u' .') return elif 'assign' in request.POST: form = self.AssignBooksForm(request.POST) if form.is_valid(): user = form.cleaned_data['user'] for book in queryset: assign_book(book.pk, user.pk) self.message_user(request, u' (%s) %s.' % (queryset.count(), user.username)) return HttpResponseRedirect(request.get_full_path()) if not form: form = self.AssignBooksForm(initial={'_selected_action': queryset.values_list('os_id', flat=True)}) return render_to_response('books/assign_books.html', {'books': queryset, 'form': form, 'path':request.get_full_path()}, context_instance=RequestContext(request)) assign_books.short_description = u' ' actions = ['assign_books']
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд░реЗрдЦрд╛ рдХреЗ рдмрдЬрд╛рдп:
form = self.AssignBooksForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
рдРрд╕реА рд░реЗрдЦрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдБ ):
form = self.AssignBooksForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})
рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ (рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдКрдкрд░ "рд╕рднреА рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ ... (...)" рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛, рддреЛ рдЬреЗрдПрд╕ рдиреЗ рдЫрд┐рдкреЗ рд╣реБрдП рдлрд╝реАрд▓реНрдб "select_across" рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, ModelAdmin.response_action ( contrib.admin.options), рдЬрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ select_across (BooleanField) рдлрд╝реЙрд░реНрдо (contrib.admin.helpers.ActionForm) рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рдпрд╣ рдЙрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдХреНрд╡реЗрд░реА рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрд░рд╡рд╛рдИ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реНрдг рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреА рд╣реИ (рд▓реЗрдХрд┐рди рд╕рд╛рдордЧреНрд░реА рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ, response_action рд╡рд┐рдзрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ)ред
рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
<p> :</p> <ul> {% for book in books %} <li>{{ book }}</li> {% endfor %} </ul>
рдХрд┐ рд╕реВрдЪреА рд╕рд╣реА рд╣реЛрдЧреА (рдЗрд╕рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдВрдЧреЗ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ 100) - рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЪреЗрдХрдорд╛рд░реНрдХ рдХреА рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреГрд╖реНрда рд╕реЗ рдПрдХ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ 100 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдВрдЧреА, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд╕рд╛рде рд╣реА рдХреА рдЬрд╛рдПрдЧреАред
рд╡реИрд╕реЗ,
рдЗрд╕ рдкреЛрд╕реНрдЯ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде Trac рдореЗрдВ рдПрдХ
рдЯрд┐рдХрдЯ рднреА рд╣реИред
2. рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛редрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдп, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рд╢рдмреНрджрдХреЛрд╢
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ
рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рднреА рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдХреЗ рдмрд┐рдирд╛)ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '[%(levelname)s] %(asctime)s %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', }, }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler' }, 'books_log_file':{ 'level': 'DEBUG', 'class': 'logging.FileHandler', 'formatter': 'verbose', 'filename': os.path.join(PROJECT_ROOT, 'logs/books.log'), }, }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, 'books': { 'handlers': ['books_log_file', 'mail_admins'], 'level': 'INFO', 'propagate': True, }, } }
рдпрд╣рд╛рдБ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ PROJECT_ROOT рдЕрдзрд┐рдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
import os PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк
рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
3. рдореВрд▓ рдкрд╛рда рддрд╛рд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рд╕рд╛рдЗрдЯ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдгредDjango рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк
JS рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ , рдФрд░ рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ (рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реВрд╕реА рдореЗрдВ), рддреЛ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЕрдВрдЧреНрд░реЗрдЬреА рдЕрдиреБрд╡рд╛рдж (django-admin.py makemessages -l en -d djjojs) рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рди рдХрд░реЗрдВ djangojs.po, рдпрд╣ рдЕрдиреБрд╡рд╛рдж рди рдХреЗрд╡рд▓ рддрдм рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЕрдВрдЧреНрд░реЗрдЬреА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдмрд▓реНрдХрд┐ рдЬрдм рд░реВрд╕реА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣реА рд╣реИ, рдЖрдк рд░реВрд╕реА рдЪреБрдирддреЗ рд╣реИрдВ, рдФрд░ рдЬреЗрдПрд╕ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рддрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд░реВрд╕реА рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдВрдЧреНрд░реЗрдЬреА рд▓реЗрддреЗ рд╣реИрдВ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд╛рд░ рдХреЗ рдореВрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрд╕реА рдореЗрдВ рд╣реИрдВ)ред
рд╕рдорд╛рдзрд╛рди (рдЬрдм рддрдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдиреЗ рддреБрд░рдВрдд рд░реВрд╕реА рдкрд╛рда рдХрд╛ рд░реВрд╕реА рдЕрдиреБрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛) рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рдЖрдкрдХреЛ рдирд┐рдореНрди рдкреИрдЯрд░реНрди рдХреЛ urls.py рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
url(r'^jsi18n/null/$', 'django.views.i18n.null_javascript_catalog'),
рдФрд░ рд╡рд╣рд╛рдВ рдкрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ (рдЖрдорддреМрд░ рдкрд░ рдмреЗрд╕ред Html) рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
{% if request.LANGUAGE_CODE == 'ru' %} <script type="text/javascript" src="{% url django.views.i18n.null_javascript_catalog %}"></script> {% else %} <script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script> {% endif %}
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ django.views.i18n.javascript_catalog рдХреЗ рд▓рд┐рдП urlpattern рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИред
4. рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд░рд▓ рдкреГрд╖реНрда (рдлрд╝реНрд▓реИрдЯрдкреЗрдЬ) рдЬреЛрдбрд╝рдирд╛редDjango рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕
рдлрд╝реНрд▓реИрдЯрдкреЗрдЬ рдПрдкреНрд▓рд┐рдХреЗрд╢рди
рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ , рдФрд░ рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЧрд▓рддреА рд╕реЗ рд╕реВрдЪреА рд╕реЗ рд╕рд╛рдЗрдЯреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ 500 рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА, рдпрд╛ рдпрджрд┐ DEBUG рд╕рдХреНрд╖рдо рд╣реИ:
ValueError рдкрд░ / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдлрд╝реНрд▓реИрдЯрдкреЗрдЬ / рдлрд╝реНрд▓реИрдЯрдкреЗрдЬ / рдРрдб /
рдХреНрд╡реЗрд░реА рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛рдмреЗрд╢рдХ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ
рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдкрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рддреАрди рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджрд░рдЕрд╕рд▓, рдЗрд╕реЗ рдареАрдХ
рдХрд░рдиреЗ рд╡рд╛рд▓реА
рдХрдорд┐рдЯрдореЗрдВрдЯ рдореЗрдВ , рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдкреНрд▓рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг), рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ Django рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдкреИрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ (Django 1.4.1 рдХреА рд░рд┐рд▓реАрдЬ рд╕рд╣рд┐рдд, рдЬреЛ рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рдерд╛)
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдПрдХ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рд╕рдорд╛рдзрд╛рди рднреА рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рд░ рдЬрдЧрд╣ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ!