Django中没有内容的PDF文件
更新 朋友们好 我想请你帮忙 我创建了一个生成PDF文件的web表单。一切都很好。通过电子邮件自动发送PDF是可以的。遗憾的是,PDF(目录)中不包括未添加到models.Model的表单字段 PDF文档(邮政编码)显示为空白字段 我不知道该怎么办。问题在哪里 model.pyDjango中没有内容的PDF文件,django,django-models,django-forms,Django,Django Models,Django Forms,更新 朋友们好 我想请你帮忙 我创建了一个生成PDF文件的web表单。一切都很好。通过电子邮件自动发送PDF是可以的。遗憾的是,PDF(目录)中不包括未添加到models.Model的表单字段 PDF文档(邮政编码)显示为空白字段 我不知道该怎么办。问题在哪里 model.py class Order(models.Model): name = models.CharField(max_length=50) CHOICES=[('item1','1xx'), ('it
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
forms.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
create.html
<form action="." method="post" class="order-form">
{{ form.as_ul }}
<p><input type="submit" value="Send"></p>
{% csrf_token %}
</form>
<html>
<body>
<h1>Test</h1>
<p>
{{ order.name }}<br>
{{ order.postal_code }}
</p>
</body>
</html>
pdf.html
<form action="." method="post" class="order-form">
{{ form.as_ul }}
<p><input type="submit" value="Send"></p>
{% csrf_token %}
</form>
<html>
<body>
<h1>Test</h1>
<p>
{{ order.name }}<br>
{{ order.postal_code }}
</p>
</body>
</html>
url.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
救命啊。严重。因为邮政编码不是订单模型的字段。您必须单独传递它的值。或者您可以在模型中添加该字段。如果您选择不包括,这可能会有所帮助
from celery import task
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id,postal_code):
order = Oferta.objects.get(id=order_id)
subject = 'New nr {}'.format(order.id)
message = 'Hallow, {}!\n\nBlaBlaBla.\
BlaBlaBla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order,'postal_code':postal_code})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
使用这两个值调用函数
order_created(order_id=order_id,postal_code= postal_code)
并在pdf.html中替换
{{order.postal_code}}
与
因为邮政编码不是订单模型的字段。您必须单独传递它的值。或者您可以在模型中添加该字段。如果您选择不包括,这可能会有所帮助
from celery import task
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id,postal_code):
order = Oferta.objects.get(id=order_id)
subject = 'New nr {}'.format(order.id)
message = 'Hallow, {}!\n\nBlaBlaBla.\
BlaBlaBla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order,'postal_code':postal_code})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
使用这两个值调用函数
order_created(order_id=order_id,postal_code= postal_code)
并在pdf.html中替换
{{order.postal_code}}
与
假设要在订单上存储邮政编码,则需要将OrderCreateForm上的“邮政编码”字段添加到订单模型中 型号.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
之后,您只需要为模型表单中的该字段指定radio select小部件
forms.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
假设要在订单上存储邮政编码,则需要将OrderCreateForm上的“邮政编码”字段添加到订单模型中 型号.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
之后,您只需要为模型表单中的该字段指定radio select小部件
forms.py
class Order(models.Model):
name = models.CharField(max_length=50)
CHOICES=[('item1','1xx'),
('item2','2xx')]
class OrderCreateForm(forms.ModelForm):
postal_code = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
class Meta:
model = Order
fields = ['name', 'postal_code']
from celery import task
from django.shortcuts import get_object_or_404
from oferty.models import Order
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
import weasyprint
from io import BytesIO
@task
def order_created(order_id):
order = Order.objects.get(id=order_id)
subject = 'NEW {}'.format(order.id)
message = 'Hi {}!\n\nBlablabla.\
Ident blabla {}.'.format(order.imię,
order.id)
email = EmailMessage(subject,
message,
'admin@myshop.com',
[order.email])
html = render_to_string('orders/order/pdf.html', {'order': order})
out = BytesIO()
stylesheets = [weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')]
weasyprint.HTML(string=html).write_pdf(out,
stylesheets=stylesheets)
email.attach('order_{}.pdf'.format(order.id),
out.getvalue(),
'application/pdf')
email.send()
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import get_object_or_404
from .models import Order
from django.conf import settings
from django.http import HttpResponse
from django.template.loader import render_to_string
import weasyprint
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
cart.clear()
order_created.delay(order.id)
return render(request,
'orders/order/created.html',
{'order': order})
else:
form = OrderCreateForm()
return render(request,
'orders/order/create.html',
{'cart': cart, 'form': form})
@staff_member_required
def admin_order_pdf(request, order_id):
order = get_object_or_404(Order, id=order_id)
html = render_to_string('orders/order/pdf.html',
{'order': order})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename= "order_{}.pdf"'.format(order.id)
weasyprint.HTML(string=html).write_pdf(response, stylesheets=[weasyprint.CSS(settings.STATIC_ROOT + 'css/pdf.css')])
return response
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^create/$',
views.order_create,
name='order_create'),
url(r'^admin/order/(?P<order_id>\d+)/pdf/$',
views.admin_order_pdf,
name='admin_order_pdf'),
]
class Order(models.Model):
CHOICES = [
('item1', '1xx'),
('item2', '2xx')
]
name = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50, choices=CHOICES)
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['name', 'postal_code']
widgets = {
'postal_code': forms.RadioSelect()
}
我在控制台中收到:check_arguments(*(args或()),**(kwargs或{}))TypeError:order_created()缺少1个必需的位置参数:“postal_code”您必须在order_created函数调用order_created(order_id,postal_code)中传递邮政编码是的,当然,我注意到了。不幸的是,我有这样一个错误:TypeError:order_created()缺少1个必需的位置参数:“postal_code”您可以发布调用函数的文件吗?我还添加了views.py和urls.py。你可能会注意到一些重要的事情。我相信你。我在控制台中收到:check_arguments(*(args或()),**(kwargs或{}))TypeError:order_created()缺少1个必需的位置参数:“postal_code”你必须在order_created函数调用order_created(order_id,postal_code)中传递邮政编码是的,当然,我注意到了。不幸的是,我有这样一个错误:TypeError:order_created()缺少1个必需的位置参数:“postal_code”您可以发布调用函数的文件吗?我还添加了views.py和urls.py。你可能会注意到一些重要的事情。我相信你,看起来还不错。不幸的是,它不起作用。PDF仍显示空白字段。对不起,我复制的文件不正确。。你现在可以知道怎么回事了,原谅我。好吧,我忘了在makemigrations期间添加默认值。就是这样。它起作用了。你太棒了。非常感谢,看起来还可以。不幸的是,它不起作用。PDF仍显示空白字段。对不起,我复制的文件不正确。。你现在可以知道怎么回事了,原谅我。好吧,我忘了在makemigrations期间添加默认值。就是这样。它起作用了。你太棒了。非常感谢你。