Выберите правильный выбор. Этот выбор не является одним из доступных вариантов - PullRequest
0 голосов
/ 14 января 2019

В моем приложении есть раскрывающийся список (отдел), который зависит от ранее выбранного значения из раскрывающегося списка (поле факультета). Я использую 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 ]

0 голосов
/ 14 января 2019

(перефразируя)

У меня есть раскрывающийся список, который зависит от ранее выбранного значения из другого раскрывающегося списка

У меня была похожая проблема в прошлом. это ответит на ваш вопрос? Основная идея заключается в том, что вы можете отправить всю правильную информацию нужному клиенту, но в конце дня сервер должен проверить, что был использован правильный набор параметров. Джанго злится, потому что считает, что отправленный на сервер вариант для второго выпадающего списка неверен. После получения POST вам необходимо динамически получить варианты 2-го выпадающего меню, ОСНОВАННЫЕ на то, что было отправлено в качестве выбора 1-го выпадающего списка, И ТОГДА попробуйте проверить форму.

0 голосов
/ 14 января 2019

Это потому, что вы инициализируете свой набор запросов пустым (что нормально), но никогда не обновляете его внутри самого объекта формы. Таким образом, проверка на стороне сервера не удалась.

Попробуйте обновить набор запросов в методе __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
...