首页 > 解决方案 > Django UNIQUE constraint failed: core_organization.name

问题描述

So I have a model called Organization inside core/models.py. I am trying to implement CRUD Ajax on a single page. Inspired by this post. Every time I save an object of this model I get this error as shown below. I want to have multiple organizations that are unique.

core/models.py

class Organization(models.Model):
    name = models.CharField(max_length=255, unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    gstin = models.CharField(max_length=15)
    address = models.CharField(max_length=500)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=6)
    country = models.CharField(max_length=50)
    is_billed = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.name} Organization'

core/forms.py

class OrganizationForm(forms.ModelForm):
    class Meta:
        model = models.Organization
        fields = ('name', 'address', 'state', 'city', 'zipcode', 'country', 'gstin')

core/views.py


def save_organization_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            stock = form.save(commit=False)
            stock.user = request.user
            stock.save()
            data['form_is_valid'] = True
            organizations = Organization.objects.all()
            data['html_book_list'] = render_to_string('core/includes/partial_organization_list.html', {
                'organizations': organizations
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


@login_required(login_url="/accounts/login/")
def organization_create(request):
    if request.method == 'POST':
        form = OrganizationForm(request.POST)
    else:
        form = OrganizationForm()
    return save_organization_form(request, form, 'core/includes/partial_organization_create.html')

templates/base.html

{% load static %}
<!DOCTYPE html>
<html>
  <head>
    <title>{% block head_title %}{% endblock %}</title>
    {% block extra_head %}
    {% endblock %}
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link href='https://fonts.googleapis.com/css?family=Russo One' rel='stylesheet'>
    <link rel="stylesheet" type="text/css" href="{% static 'font/flaticon.css' %}">
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
  </head>
  <body>
    {% block body %}

    {% if messages %}
    <div class="text-center">
      <strong>Messages:</strong>
      <ul>
        {% for message in messages %}
        <li>{{message}}</li>
        {% endfor %}
      </ul>
    </div>
    {% endif %}

    {% block content %}
    {% endblock %}
    {% endblock %}
    {% block extra_body %}
    {% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
            integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
            integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
            integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
    {% block javascript %}
    {% endblock %}
  </body>
</html>

templates/core/organization_list.html

{% extends 'base.html' %}

{% load static %}

{% block javascript %}
  <script src="{% static 'organizations/js/organizations.js' %}"></script>
{% endblock %}

{% block content %}

  <h1 class="page-header">Organizations</h1>

<!-- BUTTON TO TRIGGER THE ACTION -->
  <p>
    <button type="button"
            class="btn btn-primary js-create-book"
            data-url="{% url 'organization_create' %}">
      <span class="glyphicon glyphicon-plus"></span>
      New Organization
    </button>
  </p>

  <table class="table" id="book-table">
    <thead>
      <tr>
        <th>#</th>
        <th>Name</th>
        <th>Address</th>
        <th>State</th>
        <th>City</th>
        <th>Zipcode</th>
        <th>Country</th>
        <th>Billing Active</th>
      </tr>
    </thead>
    <tbody>
      {% include 'core/includes/partial_organization_list.html' %}
    </tbody>
  </table>

<!-- THE MODAL WE WILL BE USING -->
  <div class="modal fade" id="modal-book">
    <div class="modal-dialog">
      <div class="modal-content">
      </div>
    </div>
  </div>
{% endblock %}

templates/core/partial_organization_list.html

{% for organization in organizations %}
  <tr>
    <td>{{ organization.id }}</td>
    <td>{{ organization.name }}</td>
    <td>{{ organization.address }}</td>
    <td>{{ organization.state }}</td>
    <td>{{ organization.city }}</td>
    <td>{{ organization.zipcode }}</td>
    <td>{{ organization.country }}</td>
    <td>{{ organization.is_billed }}</td>
    <td>
      <button type="button"
              class="btn btn-warning btn-sm js-update-book"
              data-url="{% url 'organization_update' organization.id %}">
        <span class="glyphicon glyphicon-pencil"></span> Edit
      </button>
      <button type="button"
              class="btn btn-danger btn-sm js-delete-book"
              data-url="{% url 'organization_delete' organization.id %}">
        <span class="glyphicon glyphicon-trash"></span> Delete
      </button>
    </td>
  </tr>
{% empty %}
  <tr>
    <td colspan="8" class="text-center bg-warning">No Organization</td>
  </tr>
{% endfor %}

static/organizations/js/organizations.js

$(function () {

  $(".js-create-book").click(function () {
    $.ajax({
      url: '/profile/organization/create/',
      type: 'get',
      dataType: 'json',
      beforeSend: function () {
        $("#modal-book").modal("show");
      },
      success: function (data) {
        $("#modal-book .modal-content").html(data.html_form);
      }
    });
  });

});


$("#modal-book").on("submit", ".js-book-create-form", function () {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      success: function (data) {
        if (data.form_is_valid) {
          $("#book-table tbody").html(data.html_book_list);  // <-- Replace the table body
          $("#modal-book").modal("hide");  // <-- Close the modal
        }
        else {
          $("#modal-book .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  });


  $(".js-create-book").click(function () {
  var btn = $(this);  // <-- HERE
  $.ajax({
    url: btn.attr("data-url"),  // <-- AND HERE
    type: 'get',
    dataType: 'json',
    beforeSend: function () {
      $("#modal-book").modal("show");
    },
    success: function (data) {
      $("#modal-book .modal-content").html(data.html_form);
    }
  });
});


$(function () {

  /* Functions */

  var loadForm = function () {
    var btn = $(this);
    $.ajax({
      url: btn.attr("data-url"),
      type: 'get',
      dataType: 'json',
      beforeSend: function () {
        $("#modal-book").modal("show");
      },
      success: function (data) {
        $("#modal-book .modal-content").html(data.html_form);
      }
    });
  };

  var saveForm = function () {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      success: function (data) {
        if (data.form_is_valid) {
          $("#book-table tbody").html(data.html_book_list);
          $("#modal-book").modal("hide");
        }
        else {
          $("#modal-book .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  };


  /* Binding */

  // Create book
  $(".js-create-book").click(loadForm);
  $("#modal-book").on("submit", ".js-book-create-form", saveForm);

  // Update book
  $("#book-table").on("click", ".js-update-book", loadForm);
  $("#modal-book").on("submit", ".js-book-update-form", saveForm);

  // Delete book
  $("#book-table").on("click", ".js-delete-book", loadForm);
  $("#modal-book").on("submit", ".js-book-delete-form", saveForm);

});

And when I add a new organization I get the following error:

django.db.utils.IntegrityError: UNIQUE constraint failed: core_organization.name

How do I fix this?

标签: djangosqlitedjango-modelsdjango-formsdjango-views

解决方案


我相信您的 javascript 文件包含重复的 ajax 调用。

有 3 个调用来创建您的模态:

$(function () {

  $(".js-create-book").click(function () {

在你的 js 文件的顶部。然后在你的 js 文件中间使用相同的函数。和

var loadForm = function ()

您绑定到脚本底部的单击事件。

此外还有两个处理表单数据提交的函数:

$("#modal-book").on("submit", ".js-book-create-form", function ()

在顶部和

 var saveForm = function ()

在底部。

关于提交表单的重复可能会导致唯一约束错误,因为您要提交相同的数据两次。模态的重复加载可能不会导致任何明显的错误,而是不必要的加载。

你的javascript文件的底部,即以

$(function () {

  /* Functions */

应该足够了。


推荐阅读