Django: How to handle error message in CreateView for UNIQUE constraint failed

泪湿孤枕 提交于 2020-05-17 08:46:54

问题


I have a generic class based createview, which generates "UNIQUE constraint failed" error. I am able to handle this and redirect it to the same createview form. However i need to send an error msg to the createview saying 'Name already exists'. How to i achieve this.

model.py

    class Release(models.Model):
        name = models.CharField(max_length=200, db_index=True)

    class Feature(models.Model):
        release = models.ForeignKey(Release, 
        on_delete=models.SET_NULL, null=True, related_name='features')
        name = models.CharField(max_length=200, db_index=True)

        class Meta:
            unique_together = ('name', 'release')

view.py

    class FeatureCreate(CreateView):
        model = Feature
        fields = ['name', 'summary']

    def form_valid(self, form):
        form.instance.release_id = self.kwargs.get('pk')
    from django.db import IntegrityError
    from django.http import HttpResponseRedirect
    try:
        a = super(FeatureCreate, self).form_valid(form)
    except IntegrityError as e:
        if 'UNIQUE constraint failed' in e.args[0]:
            return HttpResponseRedirect(reverse_lazy('feature-create', args=(form.instance.release_id,)))
    return a

url.py:

    path('release/<int:pk>/feature/create/', views.FeatureCreate.as_view(), name='feature-create'),

feature_form.html:

    {% block content %}
       <form action="" method="post">
       {% csrf_token %}
       <table>
      {{ form.as_table }}
      </table>
      <input type="submit" value="Submit">
      <input type="button" value="Cancel" onclick="history.back()">
      </form>
    {% endblock %}

Any suggestions is welcome. Please help.


回答1:


from .models import Feature, Release
from django.forms.models import modelform_factory
from django.views.generic.edit import CreateView
from django.contrib import messages
class FeatureCreate(CreateView):
    form_class = modelform_factory(Feature, fields=('name', 'release'))
    template_name = 'handle_images/feature_form.html'
    success_url = '/feature/'

    def post(self, request, *args, **kwargs):
    # super().post() maybe raise a ValidationError if it is failure to save
        response = super().post(request, *args, **kwargs)
    # the below code is optional. django has responsed another erorr message
        if not self.object:
            messages.info(request, 'UNIQUE constraint failed.')
        return response

class ReleaseCreate(CreateView):
    form_class = modelform_factory(Release, fields=('name',))
    template_name = 'handle_images/feature_form.html'
    success_url = '/release/'

and: add 'django.contrib.messages' to INSTALLED_APP list in settings.py add prefix {% extends 'admin/base.html' %} to template for showing messages.info



来源:https://stackoverflow.com/questions/61514226/django-how-to-handle-error-message-in-createview-for-unique-constraint-failed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!