こんにちは、石黒と申します。

CentOS5.2 Python2.5.2 Django1.0 PostgreSQL8.2の環境で作成しています。
ユニークなフィールドを持つモデルのインスタンスを、ModelFormを使用して更新する方法で悩んでいます。

・モデルの抜粋
class Company(models.Model):
   code = models.CharField(max_length = 4, unique = True)      # 会社コード
   name = models.CharField(max_length = 100, unique = True)
   valid_from = models.DateField(default = date.today())
   valid_to = models.DateField(default = date(9999, 12, 31))
   update_datetime = models.DateTimeField(auto_now = True)

・フォームの抜粋
class CompanyForm(ModelForm):
   code = forms.CharField(label = u'会社コード', widget =
forms.TextInput(attrs = {'size': '10'}), required = True)
   name = forms.CharField(label = u'会社名', widget =
forms.TextInput(attrs = {'size': '60'}), required = True)
   valid_from = forms.DateField(label = u'有効期間(開始)', widget =
AdminDateWidget, required = True)
   valid_to = forms.DateField(label = u'有効期間(終了)', widget =
AdminDateWidget, required = True)
   def __init__(self, *args, **kwargs):
      super(CompanyForm, self).__init__(*args, **kwargs)
   class Meta:
      model = Company
   def clean_code(self):
       cleaned_code = self.cleaned_data['code']
       if not cleaned_code.isdigit():
         raise forms.ValidationError(u'会社コードには数字文字を入力してください。')
      return cleaned_code
    def clean(self):
      cleaned = super(CompanyForm, self).clean()
      date_from = cleaned.get('valid_from')
      date_to = cleaned.get('valid_to')
      if date_from is not None and date_to is not None:
         if date_to < date_from:
            raise forms.ValidationError(u'有効期間の終了日が開始日よりも前の日付です。')
      return cleaned

上記コードで、既存のCompanyインスタンスのユニークなフィールドであるcodeを変更せずに更新しようとする
と、当然(?)ですがユニーク制約に関するエラーがModelFormのバリデーションで発生します。

ModelFormのcodeフィールドのデフォルトのバリデーションを、更新中のインスタンスと同じcodeを持つ他のイ
ンスタンスが存在するかどうかチェックするように変更するには、どこにチェックするコードを記述すればいい
のでしょうか?
Djangoにおける定石のようなものがあるのでしょうか?

例えば、idが1でcodeが'0001'の会社を編集して、idとcodeを変更せずに更新しようとしたときに、
Company.objects.filter(code__exact = '0001').exclude(id__exact = 1)が空の
QuerySetを返却すればバリデ
ーションに成功するようにしたいです。

以上、よろしくお願いします。長文で申し訳ありません。
--~--~---------~--~----~------------~-------~--~----~
-----------------                       http://www.djangoproject.jp/            
             -----------------
You received this message because you are subscribed to the Google Groups 
"django-ja" group.
To post to this group, send email to django-ja@googlegroups.com
To unsubscribe from this group, send email to 
[&#x30E1;&#x30FC;&#x30EB;&#x30A2;&#x30C9;&#x30EC;&#x30B9;&#x4FDD;&#x8B77;]
For more options, visit this group at http://groups.google.com/group/django-ja
-~----------~----~----~----~------~----~------~--~---

メールによる返信