Django / Pythons is Messages - Уникальная ошибка отображает поле - PullRequest
4 голосов
/ 25 апреля 2020

Я очень новичок в программировании на Django / Python, так что, надеюсь, это простое исправление.

Я создал модель, которая при попытке добавить дублирующую запись (через ModelForm), сообщение то, что возвращается в мой шаблон, дважды отображает уникальное поле в сообщении. Это выглядит как: «fieldname» «classname» с этим «fieldname» уже существует.

Как отобразить имя поля один раз.

В настоящее время отображается сообщение: FirstNamePerson с этим FirstName уже существует.

Я хотел бы видеть следующее: Человек с таким FirstName уже существует.

Любая помощь будет принята с благодарностью. Спасибо

Models.py:

class Person(models.Model):
    FirstName = models.CharField(max_length=20, primary_key=True)

Шаблон. html

{% for message in messages %}
    <div class="alert alert-{{ message.tags }}">
        message: {{ message | striptags }}
    </div>
{% endfor %}

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Вы можете поймать исключение, которое выдается для добавления дублирующейся строки, и вы можете вызвать свое собственное исключение с помощью пользовательского сообщения.

from django.db import IntegrityError

except IntegrityError as e: 
    if 'unique constraint' in e.message: # or e.args[0] from Django 1.10
        #do something, create exception with your own message.
0 голосов
/ 27 апреля 2020

Мне удалось обойти эту проблему, используя form.errors в шаблоне вместо Django сообщений.

Используя приведенный ниже код в Template. html производит Person с этим FirstName уже существует. (это то, что я ищу)

{% if form.errors %}
    {% for key, value in form.errors.items %} 
        <div class="row testrow">
            <div class="alert alert-error col-lg-12">
                {{ value | striptags }}
            </div>
        </div>
    {% endfor %}
{% endif %}
0 голосов
/ 25 апреля 2020

Согласно документации , Django обеспечивает уникальность первичных ключей, поэтому поле должно быть уникальным во всей таблице.

primary_key = True подразумевает null = False и unique = True . Для объекта разрешен только один первичный ключ.

Если вы попытаетесь добавить дубликат FirstName, вы не сможете, и именно поэтому вы получите эту ошибку.

By по умолчанию Django добавляет AutoField для хранения первичного ключа, поэтому вам не нужно устанавливать primary_key = True. На самом деле это плохая практика - указывать имя FirstName первичным_ключем.

Итак, если вы все еще хотите опередить его на go и изменить сообщение об ошибке, вы можете изменить модель на

class Person(models.Model):
    FirstName = models.CharField(max_length=20, primary_key=True, error_messages={'unique':"Person with this FirstName already exists."})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...