/ / No Django, como você salva vários campos de formulário em um único campo de modelo como uma lista de valores usando um ModelForm? - django, django-models, django-forms

No Django, como você salva vários campos de formulário em um único campo de modelo como uma lista de valores usando um ModelForm? - django, django-models, django-forms

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 ModelForms 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 № 1

Você 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.