Выберите правильный выбор. Этот выбор не является одним из доступных вариантов
В моем приложении есть раскрывающийся список (отдел), который зависит от ранее выбранного значения из раскрывающегося списка (поле факультета). Я использую 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')
я не знаю, где я получаю это неправильно или как это исправить
2 ответа
Это потому, что вы инициализируете свой набор запросов пустым (что нормально), но никогда не обновляете его внутри самого объекта формы. Таким образом, проверка на стороне сервера не удалась.
Попробуйте обновить свой набор запросов в __init__
метод вашего 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
(Перефразирование)
У меня есть раскрывающийся список, который зависит от ранее выбранного значения из другого раскрывающегося списка
У меня была похожая проблема в прошлом. Это отвечает на ваш вопрос? Основная идея заключается в том, что вы можете отправить всю правильную информацию нужному клиенту, но в конце дня сервер должен проверить, что был использован правильный набор параметров. Джанго злится, потому что считает, что отправленный на сервер вариант для второго выпадающего списка неверен. После получения POST вам необходимо динамически получить варианты 2-го выпадающего меню, ОСНОВАННЫЕ на то, что было отправлено в качестве выбора 1-го выпадающего списка, И ТОГДА попытаться проверить форму.