1

プロジェクトの基本的なCMSシステムをまとめ、ナビゲーションバーで作成したページを注文できるように注文システムを追加します。残念ながら、私が書いたカスタムバリデーターは少し攻撃的で、ページを編集するとエラーが発生します。これは、正しい順序がデータベースにすでに存在しているためです。

フォームのモデルは次のとおりです。

class Page(models.Model):
page_name = models.CharField(max_length=100)
page_content = models.CharField(max_length=16777000)
link = models.URLField(blank=True)
order = models.IntegerField()

カスタムバリデーター:

def clean_order(self):
    data = self.cleaned_data['order']
    pg = Page.objects.filter(order=data)
    if pg.count() > 0:
        raise forms.ValidationError("This order number already exists. Use another.")
    return data

更新を実行するときに、新しい注文がすでに存在するが、現在のPageオブジェクトではない場合にのみ、カスタムバリデーターでエラーを発生させる方法はありますか?何かのようなもの:

pg = Page.objects.filter(order=data).filter(pk!=editpagepk)

ありがとう!

4

3 に答える 3

3

次のように、 excludeメソッドを使用します。

pg = Page.objects.filter(order=data).exclude(pk=self.instance.pk)
于 2013-02-07T22:01:26.997 に答える
1

Djangoクエリセットを使用excludeして、現在のオブジェクトを結果から除外します。モデルに主キーとして機能するidフィールドがあると仮定します。Page

def clean_order(self):
    order = self.cleaned_data['order']
    pg = Page.objects.filter(order=order).exclude(id=self.instance.id)
    if pg.count() > 0:
        raise forms.ValidationError(" ... ")
    return data

上記は、ModelFormを使用していることを前提としています。これは、POSTを介して送信されている現在のオブジェクトインスタンスを見つけるために必要なものだからですself.instance。この最後のポイントの詳細については、こちらをご覧ください

于 2013-02-07T22:04:13.333 に答える
0

一致するオブジェクトをクエリして、例外をキャッチすることができると思います。

try:
    Page.objects.filter(order=data).get(pk=editpagepk)
except Page.DoesNotExist:
    raise forms.ValidationError("...")
于 2015-01-23T18:23:33.657 に答える