Набор запросов Django ModelChoiceField продолжает возвращать один и тот же результат независимо от ввода

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


person Robert McLean    schedule 16.05.2019    source источник
comment
Я продолжаю пытаться разобраться в том, что происходит, но пока безуспешно. Я попытался использовать атрибут выбора вместо набора запросов, как описано в этой статье: stackoverflow.com/questions/16056045/, но не повезло. Я также попытался установить результаты набора запросов в переменную, которую затем распечатал на экране, чтобы подтвердить содержимое, и что содержимое было правильным. Затем я устанавливаю .queryset = в эту переменную, и она по-прежнему отображает ТОЛЬКО результаты из одной записи в таблице.   -  person Robert McLean    schedule 17.05.2019
comment
Чтобы проверить форму, которую я добавил, if request.method == 'POST': print(request.POST['field_name']) Он выводит выбранную опцию, поэтому страница работает, просто опция в поле выбора неверна .   -  person Robert McLean    schedule 17.05.2019


Ответы (1)


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

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

To:

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})
person ruddra    schedule 16.05.2019
comment
Я внес предложенные вами изменения (self.fields['field_name'].queryset = Field.objects.filter(discipline_Main=disciplineID)), спасибо. К сожалению, проблема все еще сохраняется. Независимо от того, что я выбираю на второй странице, в поле выбора есть только шесть одинаковых вариантов. Все еще довольно запутанно. Есть ли у вас другие предложения? - person Robert McLean; 16.05.2019