1

異なるパートナーのみを選択するようにフォームを検証しようとすると問題が発生します。クラスは次のように機能します。

class EmpployeeAdmin(admin.ModelAdmin):
    #.......

class EmployeeRoles(models.Model):
      partner = model.ForeignKey(Partner, relative_name='employee')
      employee = model.ForeignKey(Employee, relative_name='partner')

class EmployeeRolesInline(admin.TabularInline):
      model = EmployeeRoles
      extra = 0
      form = EmployeeRolesForm

forms.py 内で clean_partner 関数を使用して、現在の従業員が同じ名前のパートナーを 1 つだけ持っていることを検証します。異なるパートナーを持つ複数の EmployeeRoles オブジェクトを持つことができますが、パートナーを割り当てるのは 1 回だけにしてください。

class EmployeeRolesForm(forms.ModelForm):
      def clean_partner(self):
          partner = self.cleaned_data.get('partner')
          partner_ids=[int(p.partner_id) for p in self.instance.employee.partners.all()]
          if self.instance.partner_id is not None:
             return
          else:
             if partner.id in partner_ids:
                raise forms.ValidationError("Partner already chosen")

これは機能しません。self.instance.employee.partners.all() が空であるというエラーが表示されます。フォームが無制限であることと関係があると思いますが、問題の解決方法がわかりません。保存するたびにパートナーの選択をフィルタリングしようとしたときに発生したのと同じ問題であるため、新しい従業員ロールを追加しようとすると、持っていないパートナーのみが表示されます。誰かがエラーを回避する方法を提案できるなら、私はそれを感謝します.

4

1 に答える 1

0

unique_togetherモデルで使用できます:

class EmployeeRoles(models.Model):
      partner = model.ForeignKey(Partner, relative_name='employee')
      employee = model.ForeignKey(Employee, relative_name='partner')

      class Meta:
          unique_together = (("partner", "employee"),)
于 2012-08-17T22:43:05.247 に答える