选择一个有效的选择.该选择不是可用的选择之一 [英] Select a valid choice. That choice is not one of the available choices

查看:77
本文介绍了选择一个有效的选择.该选择不是可用的选择之一的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我有一个下拉菜单(部门),该下拉菜单取决于先前从下拉菜单(教职员工"字段)中选择的值.我正在使用ajax获取可以正常工作的新值.但是,当我尝试保存表单时,会得到选择一个有效的选择.该选择不是可用的选择之一.

In my app, i have a dropdown (department) that's depending on the previously selected value from a dropdown(faculty field). I am using ajax to get the new value which works fine. However, when i try saving the form, i get Select a valid choice. That choice is not one of the available choices.

这是我的模特

from django.db import models
from system.models import FacultyData, DepartmentData, SessionData, SemesterData, SettingsData

# Create your models here.

class SchoolFees(models.Model):
    fid = models.ForeignKey(FacultyData, on_delete= models.SET_NULL, null=True)
    did = models.ForeignKey(DepartmentData, on_delete= models.SET_NULL, null=True)
    sid = models.ForeignKey(SessionData, on_delete= models.SET_NULL, null=True)
    amount = models.CharField(max_length=30)

    def __str__(self):
        return self.amount

和我的form.py

and my form.py

from django import forms
from . import models
from system.models import FacultyData, DepartmentData, SessionData
from .models import SchoolFees



class FeesCreationForm(forms.ModelForm):
    fid = forms.ModelChoiceField(queryset=FacultyData.objects.all(), empty_label="--Select Faculty--",
                                 widget=forms.Select(attrs={'class': 'form-control'}))

    did = forms.ModelChoiceField(queryset=DepartmentData.objects.all(), empty_label="--Select Faculty First--",
                                 widget=forms.Select(attrs={'class': 'form-control'}))

    sid = forms.ModelChoiceField(queryset=SessionData.objects.all(), empty_label="--Select Session--",
                                 widget=forms.Select(attrs={'class': 'form-control'}))

    class Meta:
        model = models.SchoolFees
        fields = ['sid', 'fid', 'did', 'amount']

        widgets = {
            'amount': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter Amount'})

        }



  def __init__(self, *args, **kwargs):
    super(FeesCreationForm, self).__init__(*args, **kwargs)
    self.fields['did'].queryset = DepartmentData.objects.none()

   # Get did queryset for the selected fid
    if 'fid' in self.data:
        try:
            fd = int(self.data.get('fid'))
            self.fields['did'].queryset = DepartmentData.objects.filter(fid=fd).order_by('dept_name')
        except (ValueError, TypeError):
            pass # invalid input from the client; ignore and use empty queryset

在我的view.py中,我有一种根据所选择的系获取科系的方法.并节省新的费用

in my view.py, i have a method for getting department based on the faculty chosen. and also for saving the new fee

def create_fee(request):
    app = settings.CONFIG
    #table = FacultyTable(FacultyData.objects.all())
   # RequestConfig(request, paginate={'per_page': 10}).configure(table)
    context = {"form": FeesCreationForm,  'app': app}
    return render(request, 'bursary.html', context)

def get_department(request):

    fid = request.GET.get('fid', None)

    datas = {
        'is_taken': DepartmentData.objects.filter(fid=fid)
    }
    department = list(DepartmentData.objects.filter(fid=fid).values())
    data = dict()
    data['department'] = department
    return JsonResponse(data)

def save_fee(request):
    app = settings.CONFIG
    # table = FacultyTable(FacultyData.objects.all())
    # RequestConfig(request, paginate={'per_page': 10}).configure(table)
    form = FeesCreationForm(request.POST)
    context = {"form": FeesCreationForm, 'app': app}
    if form.is_valid():
        form.save()
        messages.add_message(request, messages.SUCCESS, "Fees added successfully")
    else:
        messages.add_message(request, messages.ERROR, form.errors)

    return redirect('bursary:create_fee')

我不知道我在哪里弄错了或者怎么解决

i don't know where i am getting this wrong or how to fix it

推荐答案

这是因为您将查询集初始化为空(可以),但是从不在表单对象本身中对其进行更新.因此服务器端验证失败.

This is because you initialize your queryset empty (which is fine), but never update it within the form object itself. So the server side validation is failing.

尝试在FeesCreationForm的 __ init __ 方法中更新查询集:

Try updating your queryset in the __init__ method of your FeesCreationForm:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    # Init empty did queryset
    self.fields['did'].queryset = DepartmentData.objects.none()

    # Get did queryset for the selected fid
    if 'fid' in self.data:
        try:
            fid = int(self.data.get('fid'))
            self.fields['did'].queryset = DepartmentData.objects.filter(
                fid=fid).order_by()
        except (ValueError, TypeError):
            # invalid input from the client; ignore and use empty queryset
            pass

这篇关于选择一个有效的选择.该选择不是可用的选择之一的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆