DjangoのPreSaveで保存しないようにする方法

Djangoで特定の条件の場合保存しないようにエラーにしたい場合があると思います。

そんな時に、pre_save関数を作成して、エラーにすることができます。

from django.db.models.signals import pre_save
from django.core.exceptions import ValidationError
from myapp.models import MyModel

def prevent_save(sender, instance, **kwargs):
    raise ValidationError('Save operation is not allowed.')

pre_save.connect(prevent_save, sender=MyModel)

エラー内容を画面に表示させる

そのままだた、サーバーエラー500になるので、キャッチして画面に表示させます

通常のフォーム

def your_view(request):
    if request.method == "POST":
        form = YourModelForm(request.POST)
        if form.is_valid():
            try:
                form.save()
                return redirect('success_url')
            except ValidationError as e:
                form.add_error(None, e.message)
    else:
        form = YourModelForm()

    return render(request, 'template_name.html', {'form': form})

管理画面

from django.contrib import admin, messages
from django.core.exceptions import ValidationError
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        try:
            super().save_model(request, obj, form, change)
        except ValidationError as e:
            messages.set_level(request, messages.ERROR)
            messages.error(request, e.message)

admin.site.register(YourModel, YourModelAdmin)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です