В 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.

Вернуться на верх