gpt4 book ai didi

Django 过滤 ModelFormSet 字段选择...与限制 Formset 的查询集不同

转载 作者:行者123 更新时间:2023-12-02 08:54:31 31 4
gpt4 key购买 nike

据我所知,可以override the default queryset 'used' by the modelformset 。这只是限制了为其创建表单的对象。

我还发现了一个关于 filtering ForeignKey choices in a Django ModelForm 的 Stack Overflow 问题,但不是 ModelForm Set 以及关于 limiting available choices in a Django formset ,但不是 Model FormSet。我已在下面包含了此代码的我的版本。

我想要做的是为学校类(class)(“teachinggroup”或“theclass”以避免与“class”关键字冲突)渲染一个 ModelFormSet,其中一个字段受查询集限制。这是教师的类(class)编辑表格,能够将学生重新分配到不同的类(class),但仅限于同一组内的类(class)。

我的模型.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']

我的观点.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,它仅是属于同一年级的类(class)。该查询集正确输出,如下面呈现的页面所示,但它根本不影响表单字段。

我的模板

{% 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 -->

页面呈现时,所有教学组(类(class))在选择小部件中可见,但页面底部的标签呈现为:[<TeachingGroup: Y8 82Ma2>, <TeachingGroup: Y8 82Ma3>] ,仅准确显示 8 年级的两个类(class)。

请注意,我还阅读了 James Bennett 的帖子 So you want a dynamic form根据 How can I limit the available choices for a foreign key field in a django modelformset? 的推荐,但这涉及修改 __init__方法,但我知道如何创建 ModelFormSet 的唯一方法是使用 modelformset_factory,它不涉及在 forms.py 中定义任何类。

进一步的帮助来自Luke Sneeringer ,这是我的新 forms.py 条目。看完Why do I get an object is not iterable error?我意识到我的一些问题来自于给 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

最佳答案

据我所知,除了一个之外,您实际上已经将所有部分组合在一起。这是最终链接。

您说您阅读了动态表单帖子,其中涉及重写您没有的 forms.Form 子类中的 __init__ 方法。但是,没有什么可以阻止您拥有一个,这就是您可以覆盖您的选择的地方。

尽管 modelformset_factory 不需要显式的 Form 类(如果未提供,它会从模型构造一个类),但它可以采用一个。使用 form 关键字参数:

PupilModelFormset = modelformset_factory(Pupil, form=PupilForm)

显然,这需要定义 PupilForm 类。我的印象是你已经知道如何做到这一点,但它应该是这样的:

from django import forms

class PupilForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PupilForm, self).__init__(*args, **kwargs)
self.fields['teaching_group'].choices = ______ # code to generate choices here

class Meta:
model = Pupil

您可能遇到的最后一个问题是 modelformset_factory 仅接受该类,这意味着将在不带参数的情况下调用构造函数。如果您需要动态发送参数,方法是创建一个生成表单 class 本身的元类,并在 modelformset_factory 调用中调用该元类。

关于Django 过滤 ModelFormSet 字段选择...与限制 Formset 的查询集不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371392/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com