Django Wars [Parte 14]: Loja de itens

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

Quando criamos a área e administração do Django-Wars, utilizando o django-admin, tinhamos em mente um objetivo: facilitar o cadastro dos itens do jogo no sistema.
Agora que a administração está funcionando e temos alguns itens cadastrados, pelo menos eu cadastrei uns para testar, surge uma nova necessidade: a loja do jogo.
a loja do jogo é um local onde os jogadores podem comprar ou vender armas e armaduras.
Com Django, vai ser molesa.

Primeiro, vamos criar uma área onde listaremos os itens disponíveis para compra e venda.
Para isso, vamos criar uma loja e cadastrar a url da loja no urls.py:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from django.conf.urls import patterns, include, url
import djangowars.views
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', djangowars.views.index),
url(r'^registrar/$', djangowars.views.registrar), # pagina de cadastro
url(r'^login/$', djangowars.views.logar), # pagina de login
url(r'^crimes/$', djangowars.views.crimes),
url(r'^loja/$', djangowars.views.loja), # pagina de loja
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
from django.conf.urls import patterns, include, url import djangowars.views # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^$', djangowars.views.index), url(r'^registrar/$', djangowars.views.registrar), # pagina de cadastro url(r'^login/$', djangowars.views.logar), # pagina de login url(r'^crimes/$', djangowars.views.crimes), url(r'^loja/$', djangowars.views.loja), # pagina de loja # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), )
from django.conf.urls import patterns, include, url

import djangowars.views

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
                       url(r'^$', djangowars.views.index),
                       url(r'^registrar/$', djangowars.views.registrar), # pagina de cadastro
                       url(r'^login/$', djangowars.views.logar), # pagina de login

                       url(r'^crimes/$', djangowars.views.crimes),

                       url(r'^loja/$', djangowars.views.loja), # pagina de loja
                       
                       # Uncomment the next line to enable the admin:
                       url(r'^admin/', include(admin.site.urls)),
)

Agora, vamos colocar a nossa view no views.py.
O que queremos é listar os itens da loja.
Para isso, vamos pegar as armas e armaduras cadastradas, e que não são secretas, além de pegarmos os itens que o usuário possui.

Importamos os modelos das armas e armaduras.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from djangowars.itens.models import Arma, Armadura #importa as armas e armaduras
from djangowars.itens.models import Arma, Armadura #importa as armas e armaduras
from djangowars.itens.models import Arma, Armadura #importa as armas e armaduras

Escrevemos a view:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# pagina da loja:
def loja(request):
if not request.user.is_authenticated():
return redirect(logar)
armas = Arma.objects.filter(secreta=False).order_by('compra', '-venda')
armaduras = Armadura.objects.filter(secreta=False).order_by('compra', '-venda')
return render_to_response("loja.html", {"armas": armas,
"armaduras": armaduras,
"player": request.user.get_profile()})
# pagina da loja: def loja(request): if not request.user.is_authenticated(): return redirect(logar) armas = Arma.objects.filter(secreta=False).order_by('compra', '-venda') armaduras = Armadura.objects.filter(secreta=False).order_by('compra', '-venda') return render_to_response("loja.html", {"armas": armas, "armaduras": armaduras, "player": request.user.get_profile()})
# pagina da loja:
def loja(request):
    if not request.user.is_authenticated():
        return redirect(logar)

    armas = Arma.objects.filter(secreta=False).order_by('compra', '-venda')
    armaduras = Armadura.objects.filter(secreta=False).order_by('compra', '-venda')

    return render_to_response("loja.html", {"armas": armas,
                                            "armaduras": armaduras,
                                            "player": request.user.get_profile()})

Por fim, precisamos escrever o template desta view na pasta templates.
O nome do arquivo, de acordo com a view acima é loja.html

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<div class="container">
<p>Armaduras:</p>
{% for armadura in armaduras %}
<img src="{{ armadura.imagem.url }}" />
{{ armadura.nome }}
{% if armadura in player.armaduras.all %}
<a href="vender/armadura/{{ armadura.pk }}">vender por {{ armadura.venda }}</a>
{% else %}
<a href="comprar/armadura/{{ armadura.pk }}">comprar por {{ armadura.compra }}</a>
{% endif %}
<br />
{% endfor %}
<hr />
<p>Armas:</p>
{% for arma in armas %}
<img src="{{ arma.imagem.url }}" />
{{ arma.nome }}
{% if arma in player.armas.all %}
<a href="vender/arma/{{ arma.pk }}">vender por {{ arma.venda }}</a>
{% else %}
<a href="comprar/arma/{{ arma.pk }}">comprar por {{ arma.compra }}</a>
{% endif %}
<br />>
{% endfor %}
</div> <!-- /container -->
<div class="container"> <p>Armaduras:</p> {% for armadura in armaduras %} <img src="{{ armadura.imagem.url }}" /> {{ armadura.nome }} {% if armadura in player.armaduras.all %} <a href="vender/armadura/{{ armadura.pk }}">vender por {{ armadura.venda }}</a> {% else %} <a href="comprar/armadura/{{ armadura.pk }}">comprar por {{ armadura.compra }}</a> {% endif %} <br /> {% endfor %} <hr /> <p>Armas:</p> {% for arma in armas %} <img src="{{ arma.imagem.url }}" /> {{ arma.nome }} {% if arma in player.armas.all %} <a href="vender/arma/{{ arma.pk }}">vender por {{ arma.venda }}</a> {% else %} <a href="comprar/arma/{{ arma.pk }}">comprar por {{ arma.compra }}</a> {% endif %} <br />> {% endfor %} </div> <!-- /container -->
<div class="container">
   <p>Armaduras:</p>
   {% for armadura in armaduras %}
       <img src="{{ armadura.imagem.url }}" />
       {{ armadura.nome }}

       {% if armadura in player.armaduras.all %}
           <a href="vender/armadura/{{ armadura.pk }}">vender por {{ armadura.venda }}</a>
       {% else %}
           <a href="comprar/armadura/{{ armadura.pk }}">comprar por {{ armadura.compra }}</a>
       {% endif %}
       <br />

   {%  endfor %}

   <hr />

   <p>Armas:</p>
   {% for arma in armas %}
       <img src="{{ arma.imagem.url }}" />
       {{ arma.nome }}

       {% if arma in player.armas.all %}
           <a href="vender/arma/{{ arma.pk }}">vender por {{ arma.venda }}</a>
       {% else %}
           <a href="comprar/arma/{{ arma.pk }}">comprar por {{ arma.compra }}</a>
       {% endif %}
       <br />>
   {%  endfor %}

</div> <!-- /container -->

Notem que neste template listamos primeiro todas as armaduras e depois todas as armas.
Para isso, utilizamos um loop for, tanto para as armas quanto para as armaduras.
Por fim, verificamos se a arma, ou armadura, do loop está na lista de itens que o usuário possui.
Se existe, imprimimos o botão “vender”.
Se não existe, imprimimos o botão “comprar”.

Bem simples, né?

O código atual pode ser visto aqui:
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 *