【问题标题】:Django/Pythons is Messages - Unique Error displays the fieldDjango/Pythons 是消息 - 唯一错误显示该字段
【发布时间】:2020-04-25 11:38:34
【问题描述】:

我对 Django/Python 编程非常陌生,所以希望这是一个简单的解决方法。

我创建了一个模型,当我尝试添加重复记录(通过 ModelForm)时,返回到我的模板的消息会在消息中两次显示唯一字段。 看起来像:具有此“字段名”的“字段名”“类名”已经存在。

如何将字段名显示一次。

当前显示的消息是: 具有此 FirstName 的 FirstNamePerson 已存在。

我希望看到的是:这个名字的人已经存在。

任何帮助将不胜感激。谢谢

模型.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 %}

【问题讨论】:

    标签: python django message


    【解决方案1】:

    您可以捕获因添加重复行而引发的异常,您可以使用自定义消息引发您自己的异常。

    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.
    

    【讨论】:

      【解决方案2】:

      根据documentation,Django 强制主键唯一性,因此该字段在整个表中必须是唯一的。

      primary_key=True 暗示 null=Falseunique=True。只有一个初级 对象上允许使用键。

      如果您尝试添加重复的 FirstName,您将无法添加,这就是您收到该错误的原因。

      默认情况下,Django 会添加一个AutoField 来保存主键,因此您不需要设置 primary_key=True。将 FirstName 设为 primary_key 实际上是一种不好的做法。

      因此,由于您仍想继续并更改错误消息,您可以将模型更改为

      class Person(models.Model):
          FirstName = models.CharField(max_length=20, primary_key=True, error_messages={'unique':"Person with this FirstName already exists."})
      

      【讨论】:

      • OP 知道这一点,问题是关于自定义异常消息。无论如何,这并不能回答问题。
      • 我知道,还在写答案。再次检查。
      • 谢谢蒂亚戈。我之前曾尝试过此操作并继续收到相同的错误 FirstNamePerson with this FirstName already exists.
      • 您进行了迁移吗?
      • 我确实进行了迁移。正如 Mahori 所解释的那样,我将研究如何捕捉异常。我是新手,但是异常捕获是我需要加快速度的东西,所以这迫使我动手。谢谢
      【解决方案3】:

      我已经设法通过在模板中使用 form.errors 而不是 Django 消息来解决这个问题。

      在 Template.html 中使用以下代码会产生 具有此 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 %}
      

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 2011-11-26
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2019-07-17
        • 1970-01-01
        相关资源
        最近更新 更多