Django: как обработать сообщение об ошибке в CreateView for UNIQUE ограничение не удалось - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть общее представление на основе класса c, которое генерирует ошибку «Неудачное ограничение не удалось». Я могу справиться с этим и перенаправить его в ту же форму создания представления. Однако мне нужно отправить сообщение об ошибке в createview со словами «Имя уже существует». Как этого добиться.

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 %}

Любые предложения приветствуются. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 30 апреля 2020
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/'

и: добавьте 'django .contrib.messages' в список INSTALLED_APP в файле settings.py добавьте префикс {% extends 'admin / base. html'%} в шаблон для отображения messages.info enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...