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
O nosso “Mafia Wars” não estaria completo se não existissem armas e armaduras para o jogador utilizar.
Para isto, criei uma nova app chamada itens no projeto.
python manage.py startapp itens
Preciso definir os modelos das Armas e das Armaduras.
Para isso, alteramos o models.py da app que acabamos de criar para conter a definição dos nossos itens.
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 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
Note que poderíamos fazer apenas um modelo ao invés de dois, diferenciando-os por uma variável que definiria o tipo (se é arma ou armadura).
Note também que nos modelos temos um campo chamado imagem do tipo models.ImageField.
Nele estamos escrevendo a pasta em que desejamos que a imagem que for enviada seja salva.
Porém, ali não está o caminho absoluto para a basta que desejamos salvar, e sim um caminho relativo.
Mas, relativo a que?
A pasta que receberá uploads está descrito na variável MEDIA_ROOT, no settings.py.
O caminho nos modelos que descrevemos é relativo a esta configuração.
Logo, para que isto funcione, precisamos alterar essa variável.
Neste projeto, vou aproveitar que anteriormente criei a pasta assets para salvar os arquivos css e js do Twitter Bootstrap para criar uma pasta chamada itens, onde as imagens dos itens serão salvas.
# Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'assets/itens').replace('\\', '/') # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" MEDIA_URL = 'http://localhost:8000/assets/itens'
Por fim, configurei também a variável MEDIA_URL.
Ao fazer o upload da imagem para o modelo, o Django não sabe a URL desta imagem, apenas o endereço dela no disco.
Se precisarmos chamar a url desta imagem a partir do objeto extraído do banco de dados, o Django poderia até ficar perdido sem saber o que dizer.
Porém, ao configurarmos a variável MEDIA_URL, ele a mapeia como se fosse um apelido (alias) para o endereço físico da imagem no HD.
Assim, o Django consegue dar a url para qualquer imagens que fizermos o upload.
Nosso projeto tá ficando porreta!
https://github.com/frenetic/django-wars