Mam formularz Django z rozszerzeniem RegexField
, który jest bardzo podobny do zwykłego pola wprowadzania tekstu.
Moim zdaniem pod pewnymi warunkami chcę to ukryć przed użytkownikiem i starać się, aby formularz był jak najbardziej podobny. Jaki jest najlepszy sposób, aby zamienić to pole w HiddenInput
pole?
Wiem, że mogę ustawić atrybuty na polu za pomocą:
form['fieldname'].field.widget.attr['readonly'] = 'readonly'
I mogę ustawić żądaną wartość początkową za pomocą:
form.initial['fieldname'] = 'mydesiredvalue'
Nie zmieni to jednak formy widżetu.
Jaki jest najlepszy / najbardziej "django-y" / najmniej "hacky" sposób na uczynienie tego pola <input type="hidden">
polem?
źródło
"" is not a valid value for a primary key.
w sposobie is_valid po użyciu tego rozwiązania.from django import forms
hidden_field_name = forms.CharField(label='reset', max_length=256, widget=forms.HiddenInput())
gdzie kluczem jest nowsza składnia widżetu na końcu. Dostosuj do swoich potrzeb.Może to być również przydatne:
{{ form.field.as_hidden }}
źródło
opcja, która u mnie zadziałała, zdefiniuj pole w oryginalnej formie jako:
wtedy gdy zastąpisz go w nowej klasie, zachowa swoje miejsce.
źródło
Po pierwsze, jeśli nie chcesz, aby użytkownik modyfikował dane, po prostu wykluczenie pola wydaje się czystsze. Włączenie go jako ukrytego pola po prostu dodaje więcej danych do przesłania przez sieć i zachęca złośliwego użytkownika do zmodyfikowania go, gdy tego nie chcesz. Jeśli masz dobry powód, aby dołączyć pole, ale je ukryć, możesz przekazać słowo kluczowe arg do konstruktora modelu. Może coś takiego:
Zatem Twoim zdaniem:
Wolę takie podejście do modyfikacji wewnętrznych elementów modelu w widoku, ale to kwestia gustu.
źródło
class Meta: exclude = ["fieldname"]
. Problem w tym, że podejście Meta jest „statyczne”, ale potrzebuję czegoś dynamicznego. Zobacz stackoverflow.com/questions/20243735/…W normalnej formie możesz to zrobić
Jeśli masz wzór, możesz wykonać następujące czynności
Możesz także zastąpić
__init__
metodęźródło
Jeśli chcesz, aby pole było zawsze ukryte, użyj:
źródło
Możesz po prostu użyć css:
Spowoduje to, że pole i jego etykieta staną się niewidoczne.
źródło