首页 > 解决方案 > Django 有一个禁用的表单作为默认选择的表单

问题描述

我目前有以下代码。在我的 forms.py

from django import forms
from django.forms.widgets import Select


class SelectWithDisabled(Select):
    def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
        disabled = False
        if isinstance(label, dict):
            label, disabled = label['label'], label['disabled']
        option_dict = super(SelectWithDisabled, self).create_option(name, value, label, selected, index, subindex=subindex, attrs=attrs)
        if disabled:
            option_dict['attrs']['disabled'] = 'disabled'
        return option_dict

GAME_PHASES = [
    ('default', {'label': 'Choose an option', 'disabled': True}),
    ('opening', 'Opening'),
    ('midgame', 'Midgame'),
    ('endgame', 'Endgame'),
]


class SettingsForm(forms.Form):
    game_phases = forms.ChoiceField(label='Phase of the Game:', choices=GAME_PHASES, required=True, widget=SelectWithDisabled)

为了澄清纯 HTML 代码,我希望我的代码执行以下操作:

<label for="phase">Phase of the Game:</label><br>
<select name="phase" id="phase" required>
    <option selected disabled>Choose an option</option>
    <option value="opening">Opening</option>
    <option value="midgame">Midgame</option>
    <option value="endgame">Endgame</option>
</select>

但是,“选择一个选项”行尚未按预期工作。

基本上,我希望我的 Django 表单代码做与纯 HTML 代码完全相同的事情。但是,在 Django 中,禁用/选择的标签似乎有冲突。在 HTML 中,当我将禁用字段设置为选中时,它从该选项开始,并且根本不会让用户在切换后返回到禁用选项。有没有办法做到这一点?默认情况下,Django 代码从 ('opening', 'Opening') 选项开始,这使得我的 required=True 字段完全过时,因为默认情况下用户被分配了该值。

PS:我的views.py看起来像这样

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import SettingsForm


def home_view(request):
    if request.method == 'GET':
        form = SettingsForm(request.GET)
        if form.is_valid():
            return HttpResponseRedirect('/play')
    else:
        form = SettingsForm()

    return render(request, "home.html", {
        'form': form
    })

标签: pythonhtmldjangodjango-formsdjango-templates

解决方案


推荐阅读