Publicações com a etiqueta "python"

Pré-inicializando formulários de um FormWizard

Por semente em 22 Jan, 2009 20h40

Se você precisa pré-inicializar dados de formulários num FormWizard do Django, você consegue da seguinte forma:

my_wizard = MyWizard(
     [StepOneForm, StepTwoForm],
     initial={
         1: {field_x: data, field_y: data, ...},
         2: {field_x: data, field_y: data, ...},
         ...
     }
)

Certo? Ok, mas e se eu quiser inserir estes dados dinamicamente, de acordo com o usuário logado no site?

A forma que eu encontrei de fazer isso foi sobrescrevendo alguns métodos da classe FormWizard. Veja um exemplo:

from django.contrib.formtools.wizard import FormWizard

class MyWizard(FormWizard):

    def parse_params(self, request, *args, **kwargs):
        self.user_data = {
            'first_name' = request.user.first_name,
            'last_name' = request.user.last_name
        }

    def get_form(self, step, data=None):
        if step == 1:
            return self.form_list[1](data, prefix=self.prefix_for_step(1),
                                     initial=self.user_data)
        else:
            super(MyWizard, self).get_form(step, data)

    ...

Não conhece o form wizard do Django? Leia mais a respeito na documentação oficial do utilitário.

PyCon Rio: e lá vou eu...

Por semente em 20 Ago, 2008 12h06

Confirmado: estou indo para a PyConBrasil, edição Rio de Janeiro. O evento ocorrerá durante os dias 18, 19 e 20 de setembro. Estarei por lá nos dias 17 à 21.

Quem vai? Será que galera da Django Brasil estará em peso por lá para um encontro informal!?

Maiores informações, no site do evento: http://pyconbrasil.com.br/.

Legibilidade e reaproveitamento de código na "URLConf"

Por semente em 08 Jul, 2008 6h00

É comum nas configurações de URL (URLconf) [1] do Django, patterns como este abaixo:

urlpatterns = patterns(
    'django.views.generic.date_based',
    (r'^(?P<year>\d{4})/(?P<month>[0-9]{2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
        'object_detail', dict(info_dict, slug_field='slug', month_format='%m')),
    (r'^(?P<year>\d{4})/(?P<month>[0-9]{2})/(?P<day>\d{1,2})/$',
        'archive_day', dict(info_dict, month_format='%m')),
    (r'^(?P<year>\d{4})/(?P<month>[0-9]{2})/$',
        'archive_month', dict(info_dict, month_format='%m')),
    (r'^(?P<year>\d{4})/$', 'archive_year', info_dict),
    (r'^/?$', 'archive_index', dict(info_dict, num_latest=5)),
)

Apesar da modificação nas URLs serem raras, a legibilidade da forma acima, queira ou não, prejudica numa eventual manutenção e a probabilidade de ocorrer um erro aumenta.

Uma solução que ao meu ver facilita muito a leitura seria utilizando a função url(), como no código abaixo, retirado do django-fleshin:

photo_detail = url(
    regex  = '^(?P<album>[-\w]+)/(?P<slug>[-\w]+)/$',
    view   = 'fleshin.views.photo_detail',
    kwargs = dict(photo_info_dict, slug_field='slug'),
    name   = 'fleshin-photo'
)
photo_list = url(                       # all photos + album list
    regex  = '^$',
    view   = 'django.views.generic.list_detail.object_list',
    kwargs = dict(photo_info_dict, paginate_by=FLESHIN_NUM_LATEST,
                  extra_context={'album_list': Album.objects.all}),
    name   = 'fleshin-photo-list'
)
photo_album_list = url(                 # only photos in ``album``
    regex  = '^(?P<album>[-\w]+)/$',
    view   = 'fleshin.views.photo_list',
    kwargs = dict(photo_info_dict, paginate_by=FLESHIN_NUM_LATEST),
    name   = 'fleshin-photo-album-list'
)

urlpatterns = patterns('', photo_detail, photo_list, photo_album_list)

Perceba também que a forma acima facilita a reutilização dos patterns pelo seu projeto, não ficando preso ao que foi definido no django-fleshin, reaproveitando, por exemplo, o mesmo padrão de URL para o detalhamento de uma Photo (photo_detail) e alterando o padrão para a listagem das mesmas (photo_list e photo_album_list).

[1]Geralmente encontrado em um arquivo de nome urls.py.