【问题标题】:Django ModelChoiceField model formset creating form for every objectDjango ModelChoiceField 模型表单集为每个对象创建表单
【发布时间】:2018-02-05 17:45:05
【问题描述】:

我正在尝试使用ModelChoiceField 设置模型表单集,以便用户可以创建多个表单,并在每个表单中从查询集中选择一个项目。但是,当我呈现我的表单集时,它会为查询集中的每个对象创建一个表单。在每个表单中,ModelChoiceField 已经设置为查询集中的下一个对象。这是不可取的,我只想要一种用户应该选择所需对象的表单,我将使用 JS 动态创建它们。基本上我将应用程序表单集嵌套在规则请求表单中。

表格:

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'
    )

【问题讨论】:

  • 这就是 formset 的工作方式。您将需要创建所需的功能。
  • @alfonso.kim 我该怎么做?我只想初始化一个表单,ModelChoiceField 不应该选择任何东西。
  • 请发布您的模型代码。
  • @alfonso.kim 好的,我已经用模型更新了问题。

标签: django forms formset modelchoicefield


【解决方案1】:

你可以从一个简单的方法开始:

在你看来:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2017-05-07
    • 2012-03-15
    • 2011-03-26
    • 2022-10-14
    相关资源
    最近更新 更多