Kata pengantar
Untuk menulis artikel ini, lapisan materi yang sangat besar telah dipelajari, tersebar di seluruh Internet, di forum, obrolan, situs blog, stackoverflow. Saya menggabungkan semuanya, karena akan berguna bagi saya dan saya sangat berharap bahwa pengembang Django lainnya juga akan senang dengan materi ini. Jika ada yang perlu ditambahkan (diperbaiki) atau diperbaiki, silakan tulis di komentar atau di Dialog (pesan pribadi) Habr.
Pengujian Handler 404
Jika kami mencoba untuk menguji kesalahan 404 dengan debug = True yang diberikan, maka kami akan menerima laporan kesalahan Django standar yang menunjukkan alasannya, tetapi menggunakan metode berikut anda dapat memeriksa bahwa kesalahan 404 bekerja tanpa kekhawatiran yang tidak perlu. Di situs yang berfungsi, saya sangat merekomendasikan menggunakan nginx.
Buka untuk mengedit file settings.py yang terletak di direktori proyek dan setel nilai debug = False
Di direktori yang sama, buka file urls.py untuk mengedit dan tambahkan baris berikut:
from django.urls import re_path
from django.views.static import serve #
re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),
debug false, , , django nginx, , , 404 Django localhost, python manage.py runserver .
, , Python/Django , .
( :
: habrhabr
: pp#6JZ2\a7y=
: , .
, Worker - FK Experience:
class Worker(models.Model):
public_cv = models.BooleanField(default=False, verbose_name='Can everyone see your resume ?')
cv_name = models.CharField(max_length=250, verbose_name='CV name', blank=True)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Author', default=0)
# +
def __str__(self):
return self.name
def publish(self):
self.published_date = timezone.now()
self.save()
class Experience(models.Model):
worker = models.ForeignKey(Worker, on_delete=models.CASCADE)
title = models.CharField(max_length=200, verbose_name='Position name')
# +
def __str__(self):
return self.title
def publish(self):
self.published_date = timezone.now()
self.save()
# +
, - django-admin, StackedInline:
class ExperienceInstance(admin.StackedInline):
model = Experience
extra = 1
@admin.register(Worker)
class PublishWorkers(admin.ModelAdmin):
inlines = [
ExperienceInstance,]
Django-admin, Experience Worker " Experience":
views.py , Experience Experience, Formset:
from django.forms import inlineformset_factory
from django.http import HttpResponseRedirect
from .forms import ExperienceForm
def expformview(request, worker_uid):
worker = Worker.objects.get(uid=worker_uid)
ExperienceFormset = inlineformset_factory(
Worker, Experience, form=ExperienceForm, extra=1, max_num=15, can_delete=True
)
if request.method == 'POST':
formset = ExperienceFormset(request.POST, instance=worker)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
formset = ExperienceFormset(instance=worker)
return render(request, 'site/expform.html',
{
'formset': formset,
'worker': worker,
}
)
, forms.py ExperienceForm:
class ExperienceForm(forms.ModelForm):
started = forms.DateField(
required=False,
label='Start date',
widget=forms.TextInput(attrs={'placeholder': 'YYYY-MM-DD'})
)
ended = forms.DateField(
required=False,
label='End date',
widget=forms.TextInput(attrs={'placeholder': 'YYYY-MM-DD'})
)
class Meta:
model = Experience
fields = ('title',
'selfedu',
)
HTML. Crispy . {{formset.media}}
WYSIWYG- ckeditor. type="submit"
, :
HTML
{% extends 'site/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
{% if worker.author == request.user%}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Experience | {{worker}}</title>
</head>
<body>
<center>
<div class="col-lg-5" style="margin:1em;">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">Basic information</li>
<li class="breadcrumb-item active" aria-current="page"><b>Experience</b></li>
<li class="breadcrumb-item">Education</li>
<li class="breadcrumb-item">Certification</li>
<li class="breadcrumb-item">Awards</li>
<li class="breadcrumb-item">Projects</li>
</ol>
</nav>
</div>
</center>
<h2 align="center" style="margin:1em;">{{worker}}'s Experience form</h2>
<form method="post">
{% csrf_token %}
<div class="row" style="margin:2em 0 2em 0;">
<div class="col-lg-5 mx-auto">
{{formset.media}}
{{formset|crispy}}
</div>
<div class="col-lg-12">
<center><button type="submit" class="btn btn-outline-warning">Save & Add</button>
<a href="edu"><button type="button" class="btn btn-outline-success">Next > Education</button></a></center>
</div>
</div>
</form>
</body>
</html>
{%else%}
<div class="row">
<div class="col-lg-12" style="margin-top:6em;">
<center>
<h2>You have not access to this section</h2>
</center>
</div>
</div>
{%endif%}
{% endblock %}
:
PDF ( )
, HTML PDF XHTML2PDF; venv :
pip install xhtml2pdf
views.py:
from xhtml2pdf import pisa
def render_pdf_view(request, worker_uid):
template_path = 'site/pdf.html'
worker = Worker.objects.get(uid=worker_uid)
exp = Experience.objects.filter(worker=worker)
context = {
'worker': worker,
'exp': exp,
}
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename="%s_%s.pdf"' % (worker.name, worker.created_date.strftime('%Y-%m-%d')) # PDF : _--
#
template = get_template(template_path)
html = template.render(context)
# PDF
pisa_status = pisa.CreatePDF(html, dest=response, )
#
if pisa_status.err:
return HttpResponse('We had some errors <pre>' + html + '</pre>')
return response
HTML , , PDF , <style></style>
.
Untuk karakter Rusia ditampilkan dengan benar dalam PDF yang diekspor Anda ingin mengunduh font yang mendukung huruf Cyrillic (Rusia), dan meletakkannya di statis / font /, pada saat yang sama menunjukkan jalur lengkap file ke teks dalam tampilan sistem direktori, seperti dalam kasus saya, jalurnya terlihat seperti ini :, /var/www/cvmaker/static/fonts/arial.ttf
dan <style/>
tambahkan yang berikut di antara tag :
@font-face {
font-family: 'sans-serif';
src: url("/var/www/cvmaker/static/fonts/arial.ttf");
}
body{
font-family: "sans-serif";
}
Jadi, dalam file PDF yang diekspor, alih-alih kotak hitam sebagai pengganti huruf Rusia, kami melihat karakter Sirilik normal: