2017-08-28 96 views
0

我试图设置一个模型表单集合ModelChoiceField,以便用户可以创建多个表单并在每个表单中从查询集中选择一个项目。但是,当我渲染我的formset时,它正在为queryset中的每个对象创建一个表单。在每个表单中,ModelChoiceField已被设置为查询集中的下一个对象。这是不可取的,我只想要一个表单,用户应该选择所需的对象,我会用JS动态创建它们。基本上,我在rulerequest表单中嵌套了应用程序表单集。Django ModelChoiceField模型formset为每个对象创建表单

形式:

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

那是formset的工作。您将需要创建所需的功能。 –

+0

@ alfonso.kim我该怎么做?我只想初始化一个窗体,'ModelChoiceField'不应该有任何选择。 – lampwins

+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来减少代码。

请注意,这不是您的问题的完整解决方案。这取决于你想如何创建表单。

相关问题