我正在尝试使用ModelChoiceField
设置模型表单集,以便用户可以创建多个表单,并在每个表单中从查询集中选择一个项目。但是,当我渲染我的formset时,它正在为查询集中的每个对象创建一个表单。在每个表单中,ModelChoiceField
已设置为查询集中的下一个对象。这是不可取的,我只想要一个用户应该选择所需对象的表单,我将使用JS动态创建它们。基本上我将应用程序formset嵌套在rulerequest表单中。
形式:
class ApplicationForm(BootstrapMixin, forms.ModelForm):
name = forms.ModelChoiceField(
queryset=Application.objects.all(),
to_field_name='name',
help_text='Application name',
error_messages={
'invalid_choice': 'Application not found.',
}
)
class Meta:
model = Application
fields = [
'name'
]
help_texts = {
'name': "Application name",
}
class RuleRequestForm(BootstrapMixin, forms.ModelForm):
class Meta:
model = RuleRequest
fields = [
'name', 'description',
]
help_texts = {
'name': 'Short name for the request',
'description': "Buisness case and summary.",
}
def __init__(self, *args, **kwargs):
super(RuleRequestForm, self).__init__(*args, **kwargs)
data = kwargs.get('data')
initial = kwargs.get('initial')
application_formset = modelformset_factory(Application, form=ApplicationForm, extra=0, min_num=1)
self.applications = application_formset(data=data, initial=initial, prefix='applications')
型号:
class Application(CreatedUpdatedModel):
name = models.CharField(
max_length=255,
null=True
)
description = models.TextField(
blank=True
)
def __str__(self):
return self.name
class RuleRequest(CreatedUpdatedModel, ST2ExecuationModel):
name = models.CharField(
max_length=255
)
description = models.TextField(
blank=False
)
applications = models.ManyToManyField(
to=Application,
related_name='rule_requests'
)
答案 0 :(得分:0)
你可以从一个简单的方法开始:
在您看来:
applications = Application.objects.all()
return render('template_name.html', request, applications)
在你的模板中:
<select id="application-select">
{% for application in applications %}
<option value="{{ application.name }}">{{ application.description }}</option>
{% endfor %}
<!-- in your javascript -->
$('#application-select').on('change', function (e) {
var optionSelected = $("option:selected", this);
var valueSelected = this.value;
// do something with the selected option
});
一旦为表单定义了行为,就可以使用Django的ModelForm
来减少代码。
请注意,这不是解决您问题的完整解决方案。这取决于您希望如何创建表单。