Powiedz, że mam tabelę address
i ma ona pole postal_code
- ModelChoiceField nie pozwala mi używać czegoś innego niż PKs do sprawdzania poprawności istnienia? Jaka byłaby droga? Normalne wejście i użycie clean_*()
?Django ModelChoiceField - użyj czegoś innego niż id?
Odpowiedz
ModelChoiceFields służą do wybierania między wyborem istniejących instancji modelu. Jest to prawie zawsze najlepiej reprezentowane przez jakąś formę pola Wybierz.
Powiedziałeś, że naprawdę masz adres FK z adresu do kodu pocztowego, jak sugerujesz. Co przechowujesz w tabeli PostalCode, aby uzasadnić dodatkową tabelę, która będzie wymagać połączenia dla każdego zapytania związanego z adresem?
Dla większości przypadków kod pocztowy powinien być po prostu CharField iw takim przypadku, jeśli chcesz sprawdzić, czy wartość jest poprawna, możesz użyć atrybutu choices
z listą ważnych kodów pocztowych. Pamiętaj, że ręczne pilnowanie listy ważnych kodów pocztowych to ogromny problem.
Jeśli naprawdę masz tabelę kodów pocztowych i uważasz, że to dobry pomysł (w niektórych przypadkach może to być), możesz rozważyć faktyczne użycie kodu pocztowego jako klucza podstawowego, a nie domyślnego autoinkrementacji, ponieważ jest to Twoje dane są bardziej eksportowalne i rozwiązuje problem z walidacją.
Jeśli postal_code
jest obcym kluczem do modelu kodu pocztowego, który zawiera ważne kody pocztowe, po prostu skorzystam z funkcji CharField, a następnie wykonaj czysty, jak sugerowałeś. Moja czysta metoda wyglądałaby tak:
def clean_postal_code(self):
try:
code = PostalCode.objects.get(code_field=self.data['postal_code'])
except:
raise forms.ValidationError("Please enter a valid postal code")
return code
Co z numerem to_field_name
? Nie jestem pewien, czy jest to udokumentowane w dowolnym miejscu, ale można je łatwo znaleźć między ModelChoiceField
parami konstruktora: https://github.com/django/django/blob/master/django/forms/models.py. Służy do filtrowania zestawu zapytań pól.
Na przykład:
articles = ModelChoiceField(queryset=Articles.objects.all(),
to_field_name='slug')
Działa idealnie. – user240515
Uwaga, w wersji 1.4 (nie próbowałem jeszcze 1.5, przepraszam) jest uszkodzony, gdy jest używany z argumentem 'instance', ponieważ' model_to_dict' na siłę używa PK (właściwie 'value_for_object'). Do obejścia trzeba zrobić 'YourForm (..., instance = foo, initial = {" bar ": foo.bar.slug})'. Zobacz szczegóły implementacji 'BaseModelForm .__ init__'. – drdaeman
@drdaeman [Rzeczywiście] (https://code.djangoproject.com/ticket/20202) – valtron
- 1. Hibernuj jeden do wielu używając czegoś innego niż klucz podstawowy
- 2. Flask - zagnieżdżony api api - użyj czegoś innego niż widok metodyczny lub czy zrobiłem zły projekt?
- 3. Django ModelChoiceField(), a wartość początkowa
- 4. Django: ModelChoiceField usunąć domyślny --------- wybór
- 5. Python: Histogram z obszarem znormalizowanym do czegoś innego niż 1
- 6. Django ModelChoiceField: filtrowanie zapytanie i ustawień domyślną wartość jako przedmiot
- 7. Django ModelChoiceField nie ma przycisku plusa
- 8. Django - Jak działa zestaw zapytań ModelChoiceField?
- 9. Formy Django: jak dynamicznie tworzyć etykiety ModelChoiceField
- 10. ModelChoiceField, usuwając puste wybór
- 11. Czy powinienem używać System.out.println() lub czegoś innego?
- 12. Właściwe użycie RxSwift do żądania łańcuchów, flatMap lub czegoś innego?
- 13. Django - ostatnia wstawka id
- 14. django prefetch_related id tylko
- 15. Użyj innego polecenia diff z CVS?
- 16. Użyj DIV jako tła dla innego elementu
- 17. Scala SortedSet - posortowane według Zamawiającego i niepowtarzalne według czegoś innego?
- 18. Używanie innego szyfrowania niż domyślny
- 19. SortedList indeksowany przez coś innego niż klucz
- 20. selektor jQuery. Dlaczego $ ("# id") znajdują ("P") szybciej niż $ ("# id P")
- 21. Czy należy używać rozszerzeń SIMD lub wektorowych lub czegoś innego?
- 22. Zapytania Django - id kontra pk
- 23. Django - Ogranicz wybór do czegoś, co zależy od instancji
- 24. cakephp użyj innego modelu wewnątrz bieżącego modelu
- 25. Swift - Użyj innego startowe metoda dequeueReusableCellWithIdentifier
- 26. Jak wysłać sygnał django z innego sygnału
- 27. Użyj coroutine wewnątrz klasy innej niż MonoBehaviour
- 28. JavaFX: Użyj wątku więcej niż raz
- 29. Użyj innej nazwy pliku dla npm niż "package.json"
- 30. MPI_Recv: Odbieranie innego rozmiaru niż wysłany
Zależy jak statek relacja jest ustawiony domyślnie ITS z '' postal_code' primary_key' od modelu. Czy możesz podać więcej szczegółów, takich jak twój 'adres' i powiązane modele' postal_code'. Opcja 'ModelChoiceField' domyślnie tworzy listę rozwijaną z opcjami jako istniejącymi instancjami powiązanego modelu. – Pannu