'Types'对象没有属性'decode' /print/8 处的 AttributeError



我尝试通过"ReportLab PDF"在python-django中打印该项目,但我有一个这样的错误:

属性错误在/print/8 '类型' 对象没有属性 '解码'

我在 9 个文件中有代码

models.py

class Games(models.Model):
    title = models.CharField(max_length=50) 
    type = models.ForeignKey("Types")
    date_of_production = models.DateField()
    producer = models.ForeignKey("Producers")
    availability = models.BooleanField()
    account = models.IntegerField()
    language = models.ForeignKey("Languages", default='')
    price = models.CharField(max_length=10)
    abbr = models.CharField(max_length=5)
    def __str__(self):
       return self.title    
class Producers(models.Model):
      name = models.CharField(max_length=10)
      date = models.DateField()
      def __str__(self):
          return self.name 
class Types(models.Model):
      type = models.CharField(max_length=10)
      def __str__(self):
          return self.type
class Languages(models.Model):
      language = models.CharField(max_length=15)
      def __str__(self):
          return self.language

Admin.py

from django.contrib import admin
#from main.models import Game
from main.models import Games
from main.models import Producers
from main.models import Types
from main.models import Languages
# Register your models here.

#admin.site.register(Game)
admin.site.register(Games)
admin.site.register(Producers)
admin.site.register(Types)
admin.site.register(Languages)

forms.py

from django import forms
class GamesForm(forms.Form):
    title = forms.CharField(label= "Nazwa gry", max_length=50)
    type = forms.CharField(label= "Typ gry", max_length=10)
    date_of_production = forms.DateField(label= "Data produkcji")
    producer = forms.CharField(label= "Nazwa producenta", max_length= 10)
    availability = forms.BooleanField(label= "Czy jest dostępne?")
    account = forms.IntegerField(label= "Ilość dostępnych sztuk")
    language = forms.CharField(label= "Języki", max_length=50)
    price = forms.CharField(label= "Cena", max_length=10)
    abbr = forms.CharField(label= "Skrót waluty", max_length=5)
class ProducersForm(forms.Form):
    name = forms.CharField(label= "Nazwa producenta", max_length=10)
    date = forms.DateField(label= "Data powstania")
class TypesForm(forms.Form):
    type = forms.CharField(label= "Typ gry", max_length=10)
class LanguagesForm(forms.Form):
    language = forms.CharField(label= "Języki", max_length=15)

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.http import HttpResponseRedirect 
from django.http import Http404
import datetime
from .forms import *
from .models import Games
from .models import Producers
from .models import Types
from .models import Languages
from django.contrib.auth.decorators import login_required
from reportlab.pdfgen import canvas
def printgame (request,id):
    #try:
        game = Games.objects.get(pk=id)
        response = HttpResponse(content_type='application/pdf')
        response['Content-Deposition'] = 'filename="report.pdf"'

        page = canvas.Canvas(response)
        page.setLineWidth(.3)
        page.setFont('Verdana', 12)
        page.drawString(30,750, "Wydruk gry: ")
        page.drawString(30,700, "Tytuł gry: ")
        page.drawString(100,700, game.title )
        page.drawString(30,650, "Typ gry: ")
        page.drawString(130,650, game.type)
        page.drawString(30,600, "Data produkcji: ")
        page.drawString(150,600, game.date_of_production)
        page.drawString(30,550, "Dostępność: ")
        page.drawString(130,550, game.availability)
        page.drawString(30,500, "Ilość: ")
        page.drawString(130,500, game.account)
        page.drawString(30,450, "Język: ")
        page.drawString(130,450, game.language)
        page.drawString(30,400, "Cena: ")
        page.drawString(130,400, game.price)
        page.drawString(30,350, "Skrót waluty: ")
        page.drawString(130,350, game.abbr)
        page.line(30, 325, 300, 325)
        page.drawString(30,250, "Dane techniczne ")
        page.drawString(30,200, "ID gry:")
        page.drawString(200,200, id)
        page.showPage()
        page.save()
        return response

edit.py

{% extends 'main/layout.html' %}
{% block  content %}
<h1>edycja gier o ID={{ Games.id }}</h1>
   <form action="/edit/{{ Games.id }}" method="post">
   {% csrf_token %}
   Nazwa gry:
   <input type="text" name="title" value="{{ Games.title }}"> </input></br>
   Typ gry:
   <input type="text" name="type" value="{{ Games.type }}"> </input></br>
   Data produkcji:
   <input type="text" name="date_of_production" value="{{ Games.date_of_production }}"> </input></br>
   Nazwa producenta:
   <input type="text" name="producer" value="{{ Games.producer }}"> </input></br>
   Czy jest dostępne? :
   <input type="checkbox" name="availability" value="{{ Games.availability }}"> </input></br>
   Ilość dostępnych sztuk:
   <input type="text" name="account" value="{{ Games.account }}"> </input></br>
   Języki:
   <input type="text" name="language" value="{{ Games.language }}"> </input></br>
   Cena:
   <input type="text" name="price" value="{{ Games.price }}"> </input></br>
   Skrót waluty:
   <input type="text" name="abbr" value="{{ Games.abbr }}"> </input></br>
   <input type="submit" value="Zapisz"></input>
   </form>
{% endblock %}

列表.html

<h1>Lista gier</h1>
<table border=1>
     <tr>
     <th>Nazwa gry</th>
     <th>Typ gry</th>
     <th>Data produkcji</th>
     <th>Nazwa producenta</th>
     <th>Czy jest dostępne?</th>
     <th>Ilość dostępnych sztuk</th>
     <th>Języki</th>
     <th>Cena</th>
     <th>Skrót waluty</th>
     <th>Edycja</th>
     <th>Usuwanie</th>
     <th>Druk PDF</th>
     </tr>
     {% for Games in all_games %}
     <tr>
     <th><a href="/view/{{Games.id}}">{{Games.title}}</a></th>
     <th>{{Games.type}}</th>
     <th>{{Games.date_of_production}}</th>
     <th>{{Games.producer}}</th>
     <th>{{Games.availability}}</th>
     <th>{{Games.account}}</th>
     <th>{{Games.language}}</th>
     <th>{{Games.price}}</th>
     <th>{{Games.abbr}}</th>
     <td><a href="/edit/{{Games.id}}">Edycja</td>
     <td><a href="/delete/{{Games.id}}">Usuń</td>
     <td><a href="/print/{{Games.id}}">PDF</td>
     </tr>
      {% endfor %}
     </table>
     <a href="/new/">Nowa gra</a>
{% endblock %}

新.html

{% extends 'main/layout.html' %}
{% block  content %}
<h1>Nowa gra</h1>
   <form action="/new/" method="post">
   {% csrf_token %}
   Nazwa gry:
   <input type="text" name="title"> </input></br>
   Typ gry:
   <input type="text" name="type"> </input></br>
   Data produkcji:
   <input type="date" name="date_of_production"> </input></br>
   Nazwa producenta:
   <input type="text" name="producer"> </input></br>
   Czy jest dostępne?
   <input type="checkbox" name="availability"> </input></br>
   Ilość dostępnych sztuk:
   <input type="number" name="account"> </input></br>
   Języki:
   <input type="text" name="language"> </input></br>
   Cena:
   <input type="number" name="price"> </input></br>
   Skrót waluty:
   <input type="text" name="abbr"> </input></br>
   <input type="submit" value="Dodaj"></input>
   </form>
{% endblock %}

查看.html

% extends 'main/layout.html' %}
{% block  content %}
<h1>Lista gier</h1>
Nazwa gry : {{ Games.title }}</br>
</br> 
Typ gry : {{ Games.type }}</br>
</br>
Data produkcji : {{ Games.date_of_production }}</br>
</br>
Nazwa producenta : {{ Games.producer }}</br>
</br>
Czy jest dostępne? : {{ Games.availability }}</br>
</br>
Języki : {{ Games.language }}</br>
</br>
Cena : {{ Games.price }}</br>
</br>
Skrót waluty : {{ Games.abbr }}</br>
{% endblock %}

urls.py

"""
from django.conf.urls import url
from django.contrib import admin
from django.contrib.auth import views as auth_views
import main.views
urlpatterns = [
    url(r'^login/$', auth_views.login, {'template_name':'main/login.html'}, name='login'),
    url(r'^logout/$', auth_views.logout, {'next_page':'main/logout.html'}, name='logout'),
    url(r'^hellopdf/', main.views.hellopdf),
    url(r'^admin/', admin.site.urls),
    url(r'^home/', main.views.home),
#   url(r'^listb/', main.views.Gameslist),
    url(r'^games_list/', main.views.Gameslist),
    url(r'^producers_list/',  main.views.Producerslist),
    url(r'^types_list/', main.views.Typeslist),
    url(r'^languages_list/', main.views.Languageslist),
    url(r'view/(?P<id>d+)', main.views.view),
    url(r'edit/(?P<id>d+)', main.views.editgame),
    url(r'delete/(?P<id>d+)', main.views.delete),
    url(r'print/(?P<id>d+)', main.views.printgame, name='print'),
    url(r'new/', main.views.new),
    url(r'viewproducer/ (?P<id>d+)', main.views.viewproducer),
    url(r'editproducer/ (?P<id>d+)', main.views.editproducer),
    url(r'deleteproducer/ (?P<id>d+)', main.views.deleteproducer),
    url(r'newproducer/', main.views.newproducer),
    url(r'printproducer/ (?P<id>d+)', main.views.printproducer, name='printproducer'),
    url(r'viewtype/ (?P<id>d+)', main.views.viewtype),
    url(r'edittype/ (?P<id>d+)', main.views.edittype),
    url(r'deletetype/ (?P<id>d+)', main.views.deletetype),
    url(r'newtype/', main.views.newtype),
    url(r'printlanguage/ (?P<id>d+)', main.views.printtype, name='printtype'),
    url(r'viewlanguage/ (?P<id>d+)', main.views.viewlanguage),
    url(r'editlanguage/ (?P<id>d+)', main.views.editlanguage),
    url(r'deletelanguage/ (?P<id>d+)', main.views.deletelanguage),
    url(r'newlanguage/', main.views.newlanguage),
    url(r'printlanguage/ (?P<id>d+)', main.views.prinlanguage, name='prinlanguage'),
    url(r'', main.views.home, name='home'),
]

有什么想法吗?我需要这个来打印所有项目。也许我应该改变一些东西而不是拉绳?感谢每一个建议。

printgame 中更改views.py中的这一行,

page.drawString(130,650, game.type)

page.drawString(130,650, game.type.type)

相关内容

最新更新