/ / W Django, w jaki sposób zapisać wiele pól formularza w jednym polu modelu jako listę wartości za pomocą ModelForm? - django, django-models, django-forms

W Django, w jaki sposób zapisać wiele pól formularza w jednym polu modelu jako listę wartości za pomocą ModelForm? - django, django-models, django-forms

Dany:

from django.db import models
class MyModel(models.Model):
...
owners = models.CharField(max_length=255, blank=False)

gdzie owners to lista adresów e-mail oddzielonych od siebie rurami.

Na stronie znajduje się wiele <input> pola o tym samym name, więc serwer otrzymuje wartości w tablicy.

Kod HTML formularza został sporządzony osobiście i nie zawiera wbudowanych szablonów (takich jak form.as_p).

Czy Django może ModelForms obsłużyć coś takiego?

Jaka jest właściwa lokalizacja do przetwarzania transformacji danych, zarówno podczas pobierania modelu (czy muszę wprowadzić niestandardowy models.Manager?) i podczas zapisywania (co save() metoda czy przesłonię? Model"s lub ModelForm"s)?

--UPDATA DO WYJAŚNIENIA--

W bazie danych:

+-----+---------------------------+-----+
| ... |           owners          | ... |
+-----+---------------------------+-----+
| ... | "a@a.com|b@b.com|c@c.com" | ... |
+-----+---------------------------+-----+

Formularz:

<form ... >
...
<input type="text" name="owners" />
<input type="text" name="owners" />
<input type="text" name="owners" />
...
</form>

Odpowiedzi:

8 dla odpowiedzi № 1

Możesz użyć forms.MultiValueField i forms.MultiWidget. MultiValueField wie, że pole twojego modelu zawiera wiele dyskretnych wartości i MultiWidget Widżet wie, jak należy prezentować każdą dyskretną wartość. Zajmą się tworzeniem niepowtarzalnych nazw dla twoich pól, aby mogli zrekonstruować formularz POST wartości i nie będziesz musiał przesłonić żadnych metod formularza, które zapewniają implementację, tzn. nie będziesz musiał przesłonić save().

Jak widać, oficjalni doktorzy są nieco szczuplina temat. Sugeruję, abyś rzucił okiem na kod, aby dowiedzieć się, jak wszystko jest podłączone i co jest wywoływane, ponieważ twoje wymagania zawsze będą wymagać unikalnego rozwiązania, tj .: ile e-maili będzie zawierać to pole? Dokładnie dwa, więc mogę określić dwa CharField widżety ręcznie, czy będzie to między 0-2, więc muszę dynamicznie konstruować wszystko w zależności od przekazanej wartości? Jeśli potrzebujesz dobrego przykładu jako punktu odniesienia, sprawdź to pytanie SO który zawiera czyste i łatwe do naśladowania wdrożenie.

Idealnie, będziesz chciał mieć PipedEmailAddressesField to się rozszerza CharField jako pole twojego modelu, takie, które wie, że przechowuje wyprowadzone adresy e-mail. Powinien być w stanie skonstruować to samodzielnie MultiValueField pole formularza, które z kolei powinno je skonstruować MultiWidget pole.


1 dla odpowiedzi nr 2

Oto przykład zapisania modelu w widoku: http://themorgue.org/blog/2008/05/14/django-and-modelform/ Możesz uzyskać dodatkowe pola ręcznie przy użyciu request.POST["fieldname"] Mam nadzieję, że to pomogło.