1

次のように、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 Dynamic Formset」(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>

私の目標は、単一の会社、この会社に関連付けられた 1 人以上の従業員、およびこれらの従業員の 1 つだけに関連付けられた単一の Ext オブジェクトをすべて 1 回の送信で追加できるようにすることです。

これに対処する方法がわかりません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

ExtModel() がユーザー入力を必要としない場合:

フォーム.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 データが異なる場合は、さらに複雑になります。

于 2012-05-16T00:00:53.890 に答える