Como usar valores do formulário de um formulário não acoplado

votos
7

Eu tenho um relatório web que utiliza um formulário Django (novas formas) para campos que controlam a consulta usada para gerar o relatório (data, data de término, ...). O problema que estou tendo é que a página deve funcionar utilizando os valores iniciais do formulário (não ligada), mas não consigo acessar o campo cleaned_data menos que eu chamo is_valid (). Mas is_valid () sempre falha em formulários não acoplados.

Parece que as formas do Django foram concebidos com o caso de uso de edição de dados de tal forma que um formulário independente não é realmente útil para nada além de exibir HTML.

Por exemplo, se eu tenho:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)

if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

is_valid () falhará se este é um GET (uma vez que é não ligada), e se eu fizer:

if request.method == 'GET':
    form = MyForm()
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

a primeira chamada para do_query dispara exceções em form.cleaned_data, que não é um campo válido porque is_valid () não foi chamado. Parece que eu tenho que fazer algo como:

if request.method == 'GET':
    form = MyForm()
    do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

isto é, não há uma interface comum para recuperar os valores do formulário entre uma forma ligada e um uma não ligada.

Alguém vê uma maneira mais limpa de fazer isso?

Publicado 16/09/2008 em 19:45
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Se você adicionar esse método para a sua classe de formulário:

def get_cleaned_or_initial(self, fieldname):
        if hasattr(self, 'cleaned_data'):
            return self.cleaned_data.get(fieldname)
        else:
            return self[fieldname].field.initial

Você poderia, então, re-escrever seu código como:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)
    form.is_valid()

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date'))
Respondeu 16/09/2008 em 20:18
fonte usuário

votos
1

N ligados significa que não há dados associados com forma (quer inicial ou fornecida mais tarde), de modo a validação pode falhar. Como mencionado em outras respostas (e em sua própria conclusão), você tem que fornecer valores iniciais e verifique se ambos os dados consolidados e os valores iniciais.

O caso de uso para formas é o processamento de formulário e validação, então você deve ter alguns dados para validar antes de aceder cleaned_data.

Respondeu 17/09/2008 em 10:02
fonte usuário

votos
0

Você pode passar um dicionário de valores iniciais para seu formulário:

if request.method == "GET":
    # calculate my_start_date and my_end_date here...
    form = MyForm( { 'start_date': my_start_date, 'end_date': my_end_date} )
...

Veja a documentação formas API oficial , onde eles demonstram isso.

Editar : Com base em respostas de outros usuários, talvez esta seja a solução mais limpa:

if request.method == "GET":
    form = MyForm()
    form['start_date'] = form['start_date'].field.initial
    form['end_date'] = form['end_date'].field.initial
else:
    form = MyForm(request.method.POST)
if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

Eu não tentei isso, porém; alguém pode confirmar que isso funciona? Eu acho que isso é melhor do que criar um novo método, porque essa abordagem não exige outro código (possivelmente não escrito por você) para saber sobre o seu novo acessor 'mágica'.

Respondeu 16/09/2008 em 20:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more