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)