- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,可以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/
我的问题类似于 Django Passing Custom Form Parameters to Formset 我有这些课 class Game(models.Model): home_te
对于我的 Django 项目,我在模板中渲染模型表单集 election_formset = modelformset_factory(Election, except=('Complete',),
Django 文档没有很好地记录这个主题。事实上,他们在文档中唯一的引用是这一段: How to work with ModelForm and ModelFormSet WizardView.ins
我在一页上有两个表单,每个表单都有自己的提交按钮。使用 JS 脚本,我可以为这两个表单中的每一个动态添加一个新的表单集。我面临的情况是,我可以为页面上首先显示的表单添加任意数量的新表单,并且所有表单都
我现在很绝望,我想不通。对我来说这应该很容易做到,但我还没有找到任何解释这一点的答案。 两个模型之间没有外键: class Employee(models.Model): surname =
我无法使用正确的代码,但我发现了比萨饼/配料问题并且它很接近,所以我正在修改它以提出我的问题。 Django ModelForm for Many-to-Many fields 我们有很棒的披萨和浇头
我正在编写自定义模型表单集。我需要按字段“排序”的值对表单进行排序。我在子表单集类中重载了 BaseFormSet 的 __iter__ 方法。 我的类继承自BaseFormSet: class So
在 Django ModelForm 中,您可以更改字段的小部件类型,如下所示: class EntryForm(ModelForm): entity = forms.CharField()
我有一个在 View 中创建的模型集,如下所示: CarpoolFamilyInviteModelFormset = modelformset_factory(CarpoolFamilyInv
我有一个问题,需要在同一页面上提供多个模型支持的表单。我了解如何使用单个表单执行此操作,即只需创建两个表单,将它们称为不同的名称,然后在模板中使用适当的名称。 现在,您究竟如何扩展该解决方案以使用模型
我想使用 Django (1.4) modelformset,其中加载表单集时,表单将按模型中的 exam_date 字段进行排列。为此,我创建了以下简单的 BaseModelFormSet clas
我有一个由 inlineformset_factory 创建的 inlineformset。inlineformset 字段之一是 DATE 字段,我想添加一个日历小部件。 我该如何设置这个小部件?
我遇到错误 django.forms.utils.ValidationError: ['ManagementForm data is missing or has been tampered with
我只是想澄清一下。我正在处理 Django Form Wizard documentation 在文档中,它谈到表单向导能够与 ModelForm 和 ModelFormSet 一起“工作”。我想澄清
我什么时候应该使用 Form,什么时候使用 ModelForm?另外,我应该什么时候使用 FormSet,什么时候使用 ModelFormSet?似乎我可以用常规的 Form/FormSet 做任何事
将我的代码精简到最少后,它仍然无法工作。我总是得到提示: (Hidden field id) Select a valid choice. That choice is not one of the
我正在重写我们应用程序的很大一部分,它需要用户创建一个附加有奖励的项目。 该表单分为不同的步骤,前两个是正常的项目,下一个是奖励,最后是一个简单的预览,让用户来回滑动即可创建完美的项目。 我的form
我有一个模型表单 - ClinicallyReportedSample,它链接到一个样本模型。 我正在尝试为 ClinicallyReportedSample 创建一个表单集,其中基于 Sample
背景:我正在构建一个个人词典网络应用程序,并且有一个术语和定义的查询集。在我的网络应用程序中,我有一个编辑页面,我想在其中显示一个 ModelFormSet,允许用户编辑任何/所有条目,并在需要时删除
我正在使用 Django 的 FormWizard。它工作正常,但我无法正确显示任何空模型表单集。 我有一个名为 Domain 的模型。我正在创建一个像这样的 ModelFormset: Domain
我是一名优秀的程序员,十分优秀!