【问题标题】:Django formset difficultiesDjango 表单集的困难
【发布时间】:2012-05-23 11:49:51
【问题描述】:

我正在构建一个具有 Company、Employee 和 Ext 模型的 Django 应用程序:

class Company(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30)
    ...

class Employee(models.Model):
    company = models.ForeignKey(Company)
    emp_name = models.CharField(max_length=15)
    ...

class Ext(models.Model):
    employee = models.ForeignKey(Employee)
    expiry_date = models.DateField(default=lambda:datetime.datetime.now()+datetime.timedelta(days=60))
    ...

我有这些模型的以下表格:

class CompanyForm(ModelForm):
    class Meta:
        model = Company

class EmployeeForm(ModelForm):
    class Meta:
        model = Employee
        exclude = ('company')

class ExtForm(ModelForm):
    class Meta:
        model = Prize
    exclude = ('employee')

class EmployeeFormSet(BaseFormSet):

    def clean(self):
        if any(self.errors):
            return

        names = []

        for i in range(0, self.total_form_count()):
            form = self.forms[i]
            e_name = form.cleaned_data['emp_name']

            if e_name in names:
                raise forms.ValidationErrors("Employees must have unique names")

            names.append(e_name)

我遇到了“Django 动态表单集”(http://code.google.com/p/django-dynamic-formset/),我已经成功地开始工作以允许我动态地将多个员工表单添加到我的员工表单集在模板中:

<script type="text/javascript" src="{% static "js/jquery-1.4.2.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/jquery.formset.js" %}"></script>
<script type="text/javascript">
    $(function() {
        $('#eForm tbody tr').formset();
    })
</script>
...
<form id="eForm" method="post" action="">
    {% csrf_token %}
            <table border="0" cellpadding="0" cellspacing="0">
            <tbody>
            {% for form in employee_formset.forms %}
            <tr>
                        <td>{{ form.emp_name }}</td></br>
                        ...
                    </tr>
                    {% endfor %}
                    </tbody>
                </table>
        {{ employee_formset.management_form }}
        <input id="submit" type="submit" name="submit" value="Submit" />
</form>

我的目标是能够在一次提交中添加一个公司、一个或多个与该公司关联的员工,以及与这些员工中的一个关联的单个 Ext 对象。

我不确定如何解决这个问题。谁能指出我正确的方向?

【问题讨论】:

    标签: python django django-forms formset


    【解决方案1】:

    如果您的 ExtModel() 不需要任何用户输入,那么:

    forms.py

    class CompanyForm(ModelForm):
        class Meta:
            model = Company
    
    class EmployeeForm(ModelForm):
    
        ext = forms.BooleanField(initial=False)
    
        class Meta:
            model = Employee
    

    然后,在您的视图中,创建 CompanyForm 的单个实例,并使用 inlineformset_factory(Company, Employee, form=EmployeeForm)

    保存表单集时:

    if formset.is_valid():
        for form in formset:
            employee = form.save()
            if form.cleaned_data['ext'] == True
                Ext(employee=employee, ...).save()
    

    如果您需要用户输入更多 Ext 字段,并且对于任何给定职位的每个员工都需要相同的输入,则为该数据呈现一个额外的表单。如果是针对不同员工的不同 Ext 数据,那么情况会更复杂。

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2019-08-07
      • 2021-01-15
      相关资源
      最近更新 更多