Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中没有内容的PDF文件_Django_Django Models_Django Forms - Fatal编程技术网

Django中没有内容的PDF文件

Django中没有内容的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

更新

朋友们好

我想请你帮忙

我创建了一个生成PDF文件的web表单。一切都很好。通过电子邮件自动发送PDF是可以的。遗憾的是,PDF(目录)中不包括未添加到models.Model的表单字段

PDF文档(邮政编码)显示为空白字段

我不知道该怎么办。问题在哪里

model.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()
        }
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期间添加默认值。就是这样。它起作用了。你太棒了。非常感谢你。