Django Wars [Parte 10]: Corrigindo o modelo das Armas e Armaduras

O Django Wars foi idealizado e desenvolvido no Django 1.4. Algumas funcionalidades aqui descritas podem não funcionar ou funcionar de forma diferente em outras versões do Django

Depois de ativar o Django-admin e criar algumas armas e armaduras, percebi que os itens não tem nome.
Como os usuários vão saber quais são os itens que eles possuem. Apenas pelas fotos?
No Django-admin, os itens aparecem como “armadura-object” ou “arma-object”.
Não seria muito mais legals que os itens aparecessem com o nome certo?

Primeiro vamos colocar o nome nos itens.
Basta ir no models.py da app de itens e incluir um novo campo para as Armas e para as Armaduras.
Pense na dificuldade…

from django.db import models


class Arma(models.Model):
    poder = models.PositiveSmallIntegerField()
    compra = models.FloatField() # valor de compra
    venda = models.FloatField() # valor de venda
    secreta = models.BooleanField(default=False) #se a arma eh secreta ou disponivel na loja
    
    imagem = models.ImageField(upload_to="armas") #imagem do item
    
    #nome do item
    nome = models.TextField()


class Armadura(models.Model):
    poder = models.PositiveSmallIntegerField()
    compra = models.FloatField() # valor de compra
    venda = models.FloatField() # valor de venda
    secreta = models.BooleanField(default=False) #se a armadura eh secreta ou disponivel na loja
    
    imagem = models.ImageField(upload_to="armaduras") #imagem do item
    
    #nome do item
    nome = models.TextField()

Atualizamos o nosso banco de dados com o comando syncdb.

python manage.py syncdb

Acabamos de adicionar um novo campo em cada modelo, só falta resolver o problema de, no Django-admin, mostrar o nome “object” ao invés de exibir o nome do item.
Para isso, precisamos criar dentro de cada classe que define um item – a classe Arma e a classe Armadura – o método de nome __unicode__, fazendo-o retornar o campo nome.
Nosso models.py vai ficar assim:

from django.db import models


class Arma(models.Model):
    poder = models.PositiveSmallIntegerField()
    compra = models.FloatField() # valor de compra
    venda = models.FloatField() # valor de venda
    secreta = models.BooleanField(default=False) #se a arma eh secreta ou disponivel na loja
    
    imagem = models.ImageField(upload_to="armas") #imagem do item
    
    #nome do item
    nome = models.TextField()
    
    def __unicode__(self):
        return self.nome


class Armadura(models.Model):
    poder = models.PositiveSmallIntegerField()
    compra = models.FloatField() # valor de compra
    venda = models.FloatField() # valor de venda
    secreta = models.BooleanField(default=False) #se a armadura eh secreta ou disponivel na loja
    
    imagem = models.ImageField(upload_to="armaduras") #imagem do item
    
    #nome do item
    nome = models.TextField()
    
    def __unicode__(self):
        return self.nome

O que fizemos foi dizer ao Django que sempre que precisar nomear o objeto, utilize o campo self.nome.

Novamente, precisamos executar o comando syncdb.

python manage.py syncdb

E pronto, basta acessar o django-admin e ver os novos campos criados e os novos nomes dos itens.

O código fonte do projeto encontra-se em:
https://github.com/frenetic/django-wars

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *