Фильтр Django Выбор полей ModelFormSet… отличается от ограничения набора запросов Formset

Я понимаю, что можно переопределить набор запросов по умолчанию, «используемый» набором модели . Это просто ограничивает объекты, для которых создается форма.

Я также нашел вопрос о переполнении стека относительно фильтрации Выбор ForeignKey в Django ModelForm , но не в ModelForm Set , а в ограничивает доступные варианты в наборе форм Django , но не в Model FormSet. Я включил свою версию этого кода ниже.

Я хочу визуализировать ModelFormSet для школьного класса («traininggroup» или «theclass», чтобы избежать конфликта с ключевым словом «class») с одним полем, ограниченным набором запросов. Это предназначено для формы редактирования урока учителя, чтобы иметь возможность переназначать учеников в другой класс, но ограниченный классами в одной и той же группе.

My models.py

class YearGroup(models.Model):
    intake_year = models.IntegerField(unique=True)
    year_group = models.IntegerField(unique=True, default=7)
    def __unicode__(self):
        return u'%s (%s intake)' % (self.year_group, self.intake_year)

    class Meta:
        ordering = ['year_group']

class TeachingGroup(models.Model):
    year = models.ForeignKey(YearGroup)
    teachers = models.ManyToManyField(Teacher)
    name = models.CharField(max_length=10)
    targetlevel = models.IntegerField()
    def __unicode__(self):
        return u'Y%s %s' % (self.year.year_group, self.name)

    class Meta:
        ordering = ['year', 'name']

My views.py

def edit_pupils(request, teachinggroup):
    theclass = TeachingGroup.objects.get(name__iexact = teachinggroup)
    pupils = theclass.pupil_set.all()

    PupilModelFormSet = modelformset_factory(Pupil)

    classes_by_year = theclass.year.teachinggroup_set.all()
    choices = [t for t in classes_by_year]
#    choices = [t.name for t in classes_by_year] #### I also tried this

    if request.method == 'POST':
        formset = PupilModelFormSet(request.POST,queryset=pupils)
        if formset.is_valid():
            formset.save()
            return redirect(display_class_list, teachinggroup = teachinggroup)
    else:
        formset = PupilModelFormSet(queryset=pupils)
        for form in formset:
            for field in form:
                if 'Teaching group' == field.label:
                    field.choices = choices


    return render_to_response('reassign_pupils.html', locals())

Как вы можете видеть, я ограничиваю выбор только набором запросов classes_by_year, то есть только классами, принадлежащими к одной и той же годовой группе. Этот набор запросов работает правильно, как вы можете видеть на отображаемой странице ниже, но он никак не влияет на поле формы.

Мой шаблон

{% for form in formset %}
<tr>
    {% for field in form.visible_fields %}
    <td>            {# Include the hidden fields in the form #}
        {% if forloop.first %}
            {% for hidden in form.hidden_fields %}
            {{ hidden }}
            {% endfor %}
        {% endif %}
        <p><span class="bigtable">{{ field }}</span>
        {% if field.errors %}
            <p><div class="alert-message error">
            {{field.errors|striptags}}</p>
            </div>
        {% endif %}
    </td>
    {% endfor %}
</tr>
{% endfor %}
</table>
<input type="submit" value="Submit changes"></p>
</form>
{{ choices }} <!-- included for debugging -->

Страница отображается со всеми учебными группами (классами), видимыми в виджете выбора, но тег внизу страницы отображается как: [<TeachingGroup: Y8 82Ma2>, <TeachingGroup: Y8 82Ma3>], точно показывая только два класса в 8-м году.

Обратите внимание, что я также прочитал пост Джеймса Беннетта Итак, вам нужна динамическая форма в соответствии с рекомендациями Как я могу ограничить доступные варианты выбора для поля внешнего ключа в наборе форм django? , но для этого нужно изменить __init__ в файле forms.py, и все же единственный способ, которым я знаю, как создать ModelFormSet, - это modelformset_factory, который не требует определения каких-либо классов в forms.py.

В помощь Люку Снерингеру , вот моя новая запись в forms.py. После прочтения Почему я получаю объект, это не повторяемая ошибка ? Я понял, что некоторые из моих проблем возникли из-за предоставления кортежа для метода field.choices, когда он ожидал словарь. Вместо этого я использовал подход .queryset, и он отлично работает:

class PupilForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PupilForm, self).__init__(*args, **kwargs)
        thepupil = self.instance
        classes_by_year = thepupil.teaching_group.year.teachinggroup_set.all()
        self.fields['teaching_group'].queryset = classes_by_year

class Meta:
    model = Pupil
7 голосов | спросил nimasmi 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 10 Sep 2011 15:28:09 +0400 2011, 15:28:09

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132