Criando Views Extensíveis
Uma view extensível é aquela que permite que seja customizada na declaração da URL, ou seja, deve permitir a informação de parâmetros que determinem partes relevantes de seu comportamento onde for possível.
- Supondo que sua aplicação se chama "minha_app" que contenha as classes
"Produto" e "Categoria", edite o arquivo "views.py" de sua aplicação e crie uma nova view, como esta abaixo::
def produto(request, produto_id): produto = Produto.objects.get(id=produto_id) return render_to_response( 'minha_app/produto.html', locals(), )
- Agora edite o arquivo urls.py de seu projeto e acrescente a seguinte URL:
url(r'produtos/(?P<produto_id>\d+)/', 'minha_app.views.produto'),
isso será suficiente para exibir uma página a partir do template exibindo informações do produto informado na URL.
Entretanto, esse template pode não satisfazer no momento da declaração da URL, em caso desta declaração ser feita por terceiros ou de forma customizada. Portanto, é recomendável que essa view permita ser customizada, fazendo uma modificação simples.
- Acrescente o argumento "template_path" à view, que agora fica assim::
def produto(request, produto_id, template_path='minha_app/produto.html'): produto = Produto.objects.get(id=produto_id) return render_to_response( template_path, locals(), )
- E agora para testar, modifique a url como abaixo::
url(r'produtos/(?P<produto_id>\d+)/', 'minha_app.views.produto', {'template_path': 'outra_app/detalhes_do_produto.html}),
- Essa pequena modifição em sua view permite que ela seja extensível para um
codificador externo. Esta é uma prática recomendável para tornar suas aplicações plugáveis, especialmente se você deseja distribuí-las ou utilizá-las em outros projetos.
É possível permitir extender a view com o template, classe de form, classe de modelo (ou o queryset usado, para que se possa pré-filtrar), URL para redirecionamento, extra_context (dicionário de variáveis para exibir no template, como nas generic_views), e o que mais a imaginação permitir.
Tire outras dúvidas em nosso CookBook em Português