【问题标题】:Django Form with validation state for unique具有唯一性验证状态的 Django 表单
【发布时间】:2021-11-14 01:56:44
【问题描述】:

我尝试添加一个验证状态,例如“这已经存在”。 (如注册表,见图)就在我的表单输入下方。

但是当我提交我的表单时,我遇到了这个错误“唯一约束失败”

这是我的代码

型号

class Company(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    siret = models.CharField(max_length=50, unique=True)

表格

class CheckoutForm(forms.Form):
    siret = forms.CharField(required=True,  widget=forms.TextInput(attrs={'placeholder': 'Ton SIRET'}))
    class Meta:
        model = Company
        fields = ('siret')

    def clean(self):
        siret = cleaned_data.get('siret')
        if siret:
            raise forms.ValidationError("This siret exist.")
        else:
            return siret

查看

def post(self, request, *args, **kwargs):
    form = CheckoutForm(self.request.POST)
    if form.is_valid():
        siret = form.cleaned_data.get('siret')
        company = Company(
            user = self.request.user,
            siret = siret,
        )
        company.save()
        context = {
        'company': company,
        }
        
        return redirect("core:payment")
    else:
        messages.info(self.request, "Please fill in the shipping form properly")
    return redirect("core:checkout")

模板

{% load crispy_forms_tags %}
<main>
    <div class="container wow fadeIn">
        <h2 class="my-5 h2 text-left">Checkout form</h2>
        <div class="row">
            <div class="col-md-8 mb-4">
                <div class="card">

                    <form method="post" class="card-body">
                        {% csrf_token %}
                        {{ form|crispy }}
                        <button class="btn btn-primary" id="checkout-button" data-secret="{{ session_id }}">
                            Checkout
                        </button>
                    </form>
                </div>
            </div>

非常感谢

【问题讨论】:

  • 会不会是因为一个已经存在的对象而无法save 对象,这会引发 UNIQUE 约束字段
  • 是的,但是如果我的数据库中已经存在一个,我想重定向到相同的表单,并在输入下方像图片一样显示红色消息错误,例如“此 Siret 已存在”。
  • 所以你必须在你的视图中调用 clean 类,或者clean(self) 在什么时候触发?
  • 是的,但我不知道该怎么做我尝试但它不起作用..
  • 视图中的siret.clean() 是否有效? (不确定很抱歉,试图提供帮助,但我自己从来没有建立过什么)

标签: django forms unique-constraint django-crispy-forms cleaned-data


【解决方案1】:

您必须将 errors_messages 添加到您的电子邮件字段中,如下所示:

    email = models.EmailField(
    _('email address'),
    blank=True,
    unique=True,
    null=True,
    error_messages={
        'unique': _("A user with that email address already exists."),
    }
)

【讨论】:

  • 非常感谢,起初我尝试这个def clean(self): cleaned_data = super().clean() siret = cleaned_data.get('siret') if Company.objects.filter(siret=siret).count() &gt; 0: self.add_error('siret', 'This Siret already use')。它也可以工作,但你的解决方案更简单:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 2017-11-13
  • 1970-01-01
  • 2011-10-23
  • 2015-09-20
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多