选择一个有效的选择。这种选择不是可用的选择之一
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择一个有效的选择。这种选择不是可用的选择之一相关的知识,希望对你有一定的参考价值。
在我的应用程序中,我有一个下拉列表(部门),这取决于下拉列表(教师字段)中先前选择的值。我正在使用ajax来获取工作正常的新值。但是,当我尝试保存表单时,我会选择一个有效的选择。这种选择不是可用的选择之一。
这是我的模特
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
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中,我有一种基于所选教师获得部门的方法。并且还用于保存新费用
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')
我不知道我在哪里弄错了或如何解决它
答案
这是因为您将查询集初始化为空(这很好),但从不在表单对象本身内更新它。因此服务器端验证失败。
尝试在FeesCreationForm的__init__
方法中更新您的查询集:
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
另一答案
(复述)
我有一个下拉列表取决于之前从另一个下拉列表中选择的值
我过去也遇到过类似的问题。 this会回答你的问题吗?基本的想法是,您可以将所有正确的信息发送到您想要的客户端,但在一天结束时,服务器应该验证使用了正确的选项集。 Django生气,因为它认为发送到服务器的第二次下拉选项无效。收到POST后,您需要动态获取第二个下拉列表的选项基于下拉#1的选择发送的任何内容然后尝试并验证表单。
以上是关于选择一个有效的选择。这种选择不是可用的选择之一的主要内容,如果未能解决你的问题,请参考以下文章
Django - 选择一个有效的选项。该选择不是可用的选择之一
将 ajax 与 django 表单一起使用时,出现错误“选择一个有效的选择。这不是可用的选择之一。”