【问题标题】:Select a valid choice. <some choice> is not one of the available choices选择一个有效的选项。 <some choice> 不是可用选项之一
【发布时间】:2019-09-01 21:12:52
【问题描述】:

我正在尝试构建一个表单,该表单将显示一个带有选项的选择字段。现在,这些选项会针对不同类型的用户而变化。我可以从视图中设置选择字段中的值。问题是当我单击“提交”时,所有字段都变为空并收到错误消息,例如“选择一个有效的选择。2 不是可用的选择之一。”

找到正确的公司列表以显示在选择字段中的逻辑。

def get_my_companies(user):
    if user.profile.company.is_customer:
        return (user.profile_set.company.id,user.profile_set.company.name)
    elif user.is_superuser:
        companies = Company.objects.filter(is_customer=True)
        list_of_companies = [(c.id, c.name) for c in companies]
        return list_of_companies
    else:
        list_of_groups = list(user.groups.values_list('name',flat = True))
        list_of_companies = []
        # ... some more logic to find appropriate list of companies for each such user
        return list_of_companies

逻辑工作正常,页面加载时会填充值。只有在我提交表单时才会出现问题。

views.py

def home(request):
    my_companies = get_my_companies(request.user)
    myForm = device_readings_form()
    myForm.fields['company'].choices = my_companies
    if request.method == 'POST':
        myForm = device_readings_form(request.POST)
        is_historical = True
        if myForm.is_valid():
            cd = myForm.cleaned_data
            company = cd.get('company')
            #device = cd.get('device')
            date_from = cd.get('date_from')
            date_to = cd.get('date_to')
            print(date_from)
            print(date_to)
    # .... some more stuff to work. Then I return the render using template
    context = {
        'readings': data,
        'columns' : df.columns,
        'range' : {
            'from' : datetime.datetime.now().strftime('%Y-%m-%d')+ ' 00:00:00',
            'to': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        },
        'is_historical' : is_historical,
        'show_chart' : show_chart,
        'form' : myForm
    }
    return render(request,'portal/home.html',context)

forms.py

class device_readings_form(forms.Form):
    initial_from_date = datetime.date.today()
    initial_to_date = initial_from_date + datetime.timedelta(days=1)
    date_from = forms.DateField(initial=initial_from_date)
    date_to = forms.DateField(initial=initial_to_date)
    company = forms.ChoiceField()

portal/home.html

{% block sidebar %}
    <div class="col-md-4">
        <div class="content-section">
            <p class='text-muted'> <h5>Get Historical Readings</h5>
                <form  method="POST" action="{% url 'portal-home' %}">
                        {% csrf_token %}
                        {{form|crispy}}
                        <button type="submit">Submit</button>
                </form>
            </p>
        </div>
    </div>
{% endblock sidebar %}

只有在 ChoiceField 的情况下才会遇到问题。如果我删除 ChoiceField 并仅保留剩余的两个 DateField,则表单会正确提交,并且我可以读取视图中的表单值。

你们能指出我做错了什么吗?

我想正确提交表单并获取视图中的表单值进行处理。

【问题讨论】:

    标签: django-forms python-3.7


    【解决方案1】:

    解决了!!!

    解决办法是: 需要在表单实例中设置选项。

    修改如下代码:

    forms.py

    class device_readings_form(forms.Form):
        company = forms.ChoiceField()
        devices = forms.ChoiceField()
        initial_from_date = datetime.date.today()
        initial_to_date = initial_from_date + datetime.timedelta(days=1)
        date_from = forms.DateField(initial=initial_from_date)
        date_to = forms.DateField(initial=initial_to_date)
    
    
        def __init__(self, companies, devices, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['company'].choices = companies
            self.fields['devices'].choices = devices
    
    

    views.py

    def home(request):
        my_companies = get_my_companies(request.user)
        my_devices, total_list = get_available_devices(my_companies)
        is_historical = False
        show_chart = False
        myForm = device_readings_form(my_companies, total_list)
        #myForm.fields['company'].choices = my_companies
        if request.method == 'POST':
            myForm = device_readings_form(my_companies, total_list, request.POST or None)
            is_historical = True
            if myForm.is_valid():
                cd = myForm.cleaned_data
                company = cd.get('company')
                device = cd.get('devices')
                date_from = cd.get('date_from')
                date_to = cd.get('date_to')
                print(company)
                print(device)
                print(date_from)
                print(date_to)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2015-11-08
      • 2019-01-14
      • 2021-01-25
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多