В Django как добавить заполнитель в форму на основе модели charfield
У меня есть форма:
class SideEffectForm(ModelForm):
class Meta:
model = SideEffect
fields = ['se_name']
def __init__(self, *args, p, **kwargs):
super().__init__(*args, **kwargs)
if p == 'antipsychotic':
self.fields['se_name'].choices = [
("insomnia_and_agitation", "Insomnida and Agitation"),
("akathisia", "Akathisia"),
("dystonia", "Dystonia"),
]
На основе этой модели:
class SideEffect(TimeStampedModel):
SE_CHOICES = [
("insomnia_and_agitation", "Insomnida and Agitation"),
("akathisia", "Akathisia"),
("anticholinergic_effects", "Anticholinergic Side Effects")
]
se_name = models.CharField("",max_length=200, choices=SE_CHOICES, blank=False)
concern = models.IntegerField("",default=50)
case = models.ForeignKey(Case, on_delete=models.CASCADE)
В существующем виде форма отображает первый вариант. Однако я хотел бы иметь держатель, например, "Пожалуйста, выберите побочный эффект". Я мог бы сделать это с помощью одного из вариантов, но предпочел бы этого не делать, так как в этом случае мне пришлось бы принять меры, чтобы не допустить сохранения заполнителя как действительного ввода пользователя. Я перепробовал ряд предложений на сайте, но ни одно из них не помогло
Вы заявили:
Я мог бы сделать это с помощью одной из опций (например, (None, 'This is the placeholder prompt')). но я бы предпочел этого не делать, так как в этом случае пришлось бы принять меры, чтобы предотвратить сохранение заполнителя как действительного пользовательского ввода.
.
Нет, это не так, когда мы устанавливаем (None, 'This is the placeholder prompt')
, нет необходимости писать пользовательскую логику для не сохранения выбранной опции в базе данных как действительной записи пользователя.
Отрывок из Django-doc
об этом вопросе.
Если для поля не установлено значение blank=False, а также значение по умолчанию, то в поле выбора будет выведена метка, содержащая "---------". Чтобы отменить это поведение, добавьте к выбору кортеж, содержащий None; например, (None, 'Your String For Display'). В качестве альтернативы вы можете использовать пустую строку вместо None там, где это имеет смысл - например, в поле CharField.
Решение:
Вы можете просто сделать это (None, 'please select the side effect')
, но, как было сказано, при использовании CharField
вы должны использовать ('', 'please select the side effect')
вместо этого, а также вы уже установили blank=False
.
Попробуйте это:
class SideEffectForm(ModelForm):
class Meta:
model = SideEffect
fields = ['se_name']
def __init__(self, *args, p, **kwargs):
super().__init__(*args, **kwargs)
if p == 'antipsychotic':
self.fields['se_name'].choices = [
('','Please select a side effect'),
("insomnia_and_agitation", "Insomnida and Agitation"),
("akathisia", "Akathisia"),
("dystonia", "Dystonia"),
]
После этого посмотрите исходный код через Ctrl+U
и вы увидите следующий код html:
<select ...>
<option value="" selected>please select the side effect</option>
<option value="insomnia_and_agitation">Insomnida and Agitation</option>
<option value="akathisia">Akathisia</option>
<option value="dystonia">Dystonia</option>
</select>
А значение selected
не сохраняется в базе данных, поэтому если вы отправите форму с ним, вы увидите ошибку required.