Im try to print the item in python-django by "ReportLab PDF" and i have an error like this:
AttributeError at /print/8 'Types' object has no attribute 'decode'
I have codes in 9 files
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 %}
list.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 %}
new.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 %}
view.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'),
]
Any Ideas guys? I need to have this to print all of the items. Maybe should I change something instead drawstring? Thx for every advice.
Change this line in your views.py
in printgame
,
page.drawString(130,650, game.type)
To,
page.drawString(130,650, game.type.type)