Dado:
from django.db import models
class MyModel(models.Model):
...
owners = models.CharField(max_length=255, blank=False)
Onde owners
é uma lista separada por canal de endereços de email.
Na página, existem vários <input>
campos com o mesmo name
, para que o servidor obtenha os valores em uma matriz.
O código HTML do formulário foi feito manualmente e não usa modelos internos (como form.as_p
).
Django pode ModelForm
s lidar com algo assim?
Qual é o local adequado para lidar com a transformação de dados, tanto ao recuperar o modelo (eu tenho que criar um models.Manager
?) e ao salvá-lo (que save()
método que eu substituo? a Model
"s ou o ModelForm
"s)?
- ATUALIZAÇÃO DE ESCLARECIMENTO--
No banco de dados:
+-----+---------------------------+-----+
| ... | owners | ... |
+-----+---------------------------+-----+
| ... | "a@a.com|b@b.com|c@c.com" | ... |
+-----+---------------------------+-----+
A forma:
<form ... >
...
<input type="text" name="owners" />
<input type="text" name="owners" />
<input type="text" name="owners" />
...
</form>
Respostas:
8 para resposta № 1Você pode usar forms.MultiValueField
e forms.MultiWidget
. MultiValueField
sabe que o único campo do seu modelo contém vários valores discretos e o MultiWidget
O widget sabe como cada valor discreto deve ser apresentado. Eles cuidam da criação de nomes exclusivos para seus campos, para que possam reconstruir o formulário a partir de POST
valores e você não precisará substituir nenhum método de formulário que forneça implementação, ou seja, você não precisará substituir save()
.
Como você pode ver, os documentos oficiais são um pouco finosno tópico Sugiro que você dê uma olhada no código para descobrir como tudo está conectado e o que é chamado quando, pois seus requisitos sempre precisam de uma solução exclusiva, ou seja: quantos emails o campo conterá? Exatamente dois, para que eu possa especificar dois CharField
widgets manualmente, ou vai ficar entre 0-2, então tenho que construir tudo dinamicamente dependendo do valor passado? Se você precisa de um bom exemplo como referência inicial, verifique esta questão SO que contém uma implementação limpa e fácil de seguir.
Idealmente, você vai querer ter um PipedEmailAddressesField
que se estende CharField
como o campo do seu modelo, aquele que sabe que está armazenando endereços de e-mail canalizados. Deve ser capaz de construir seus próprios MultiValueField
campo de formulário que, por sua vez, deve construir seu próprio campo apropriado MultiWidget
campo.
1 para resposta № 2
Aqui está um exemplo de como salvar uma forma de modelo em uma visualização:
http://themorgue.org/blog/2008/05/14/django-and-modelform/
Você pode obter os campos extras manualmente usando request.POST["fieldname"]
Espero que isso tenha ajudado.