Набор запросов Django ModelChoiceField продолжает возвращать один и тот же результат независимо от ввода - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь создать поле выбора в форме, которая содержит только те поля, которые относятся к ранее выбранной опции.Пока что на сайте пользователь может выбрать родительский вариант (я называю дисциплиной), а затем отправить, в какое время ему предлагается выбрать из набора полей, которые являются подмножеством выбранной дисциплины.В настоящее время все страницы работают и отображаются, за исключением того, что на второй странице я также получаю 6 одинаковых результатов независимо от выбранной дисциплины.Я запустил команду печати и вижу, что objects.filter возвращает правильные результаты, но эти результаты не отображаются в раскрывающемся меню.Я в замешательстве .... какие-либо предложения?

Я перепробовал несколько онлайн-уроков и проверил несколько вопросов по обмену стека, но ничто не соответствует моей проблеме.Я действительно запутался, как

fieldOptions = Field.objects.filter(discipline_Main=discipline)
print("The available fields are: %s" % fieldOptions) 

возвращает правильные результаты:

field_name = forms.ModelChoiceField(queryset=Field.objects.filter(discipline_Main=disciplineID)) 

показывает только те же 6 результатов.

Мои модели:

class Discipline(models.Model):
    #This is the top level category ie: Math, physics, chemistry, biology, history, english, etc
    discipline_name = models.CharField(max_length=50)
    description_text = models.CharField(max_length=200)
    discipline_create_date = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.discipline_name

class Field(models.Model):
    #This is the level below discipline, example for math would be:
    #Foundations, number systems, logics, etc
    field_name = models.CharField(max_length=50)
    description_text = models.CharField(max_length=200)
    discipline_Main = models.ForeignKey(Discipline, on_delete=models.PROTECT, related_name='discipline_Main', null=True)
    create_date = models.DateTimeField('Field Creation Date', default=datetime.now, blank=True)

    def __str__(self):
        return self.field_name    

Мои просмотры:

def pullDiscipline(request):
    if request.method == 'POST':
        print("If statement has run")
        form = forms.DisciplineForm(request.POST)

        if form.is_valid():
            print("Form was valid, what now?")
            print(request.POST['discipline_name'])
            discipline = Discipline.objects.get(discipline_name=request.POST['discipline_name'])
            print("The current discipline is: %s" % discipline)
            context = discipline.id
            print("The id for chemistry is: %s" % context)
            return redirect('/assessment/pullField/%s' % context)
    else:
        print("Else statement run")
        form = forms.DisciplineForm(request.POST)
    return render(request, "assessment/pullDiscipline.html", {'form' : form})


def pullField(request, pk):
    disciplineID = pk
    form = forms.FieldForm(disciplineID, request.POST)
    return render(request, "assessment/pullField.html", {'form' : form})

Мои формы:

class FieldForm(ModelForm):

    def __init__(self,disciplineID,*args,**kwargs):
        print("Field form is called")
        print("THe disciplineID is: %s" % disciplineID)
        discipline = Discipline.objects.get(id=disciplineID)
        print("The name of the discipline is: %s" % discipline)
        fieldOptions = Field.objects.filter(discipline_Main=discipline)
        print("The available fields are: %s" % fieldOptions)
        #Fetches only requested options from Field model to populate the drop down
        super(FieldForm,self).__init__(*args, **kwargs)
        field_name = forms.ModelChoiceField(queryset=Field.objects.filter(discipline_Main=disciplineID))

    class Meta:
        model = Field
        fields = ['field_name']

И, наконец, мой файл шаблонаэто:

<form id="pullField" method="POST" >
{% csrf_token %}
{{form.field_name}}
<br>
<button type="submit" class="btn btn-default">Submit</button>
</form>

Я не получаю сообщений об ошибках, все, кажется, работает, проблема в том, что я получаю только те же 6 результатов во втором раскрывающемся списке, хотя в строке печати отображается правильный набор запросов вприставка.Любые предложения приветствуются.

1 Ответ

0 голосов
/ 16 мая 2019

Измените эту строку в вашей форме:

field_name = forms.ModelChoiceField(queryset=Field.objects.filter(discipline_Main=disciplineID))

На:

self.fields['field_name'].queryset = Field.objects.filter(discipline_Main=disciplineID)

Также, пожалуйста, не передавайте request.POST в качестве аргумента при инициации экземпляра формы, когда выне делает запрос POST.Например:

def pullField(request, pk):  # Please use Pascal Case when defining ClassName
    disciplineID = pk
    form = forms.FieldForm(disciplineID)  # removed request.POST because its a GET request
    return render(request, "assessment/pullField.html", {'form' : form})

def pullDiscipline(request):  # Please use Pascal Case when defining ClassName
    if request.method == 'POST':
        # POST related codes
    else:
        form = forms.DisciplineForm()  # removed request.POST
    return render(request, "assessment/pullDiscipline.html", {'form' : form})
...