控制字段在Django表单中是否唯一

时间:2019-06-09 12:30:56

标签: django forms

第一个错误:我要检查group_name字段值在模型形式中是否唯一 我尝试了这段代码,但似乎无法正常工作,好像我在此字段中输入了新值一样,没有消息,但数据未添加到表中

第二个错误:我没有任何消息。也许我不应该重定向页面?

我在views.py中的代码:

def group_create(request):
    group_form = GroupForm()

    if request.method == "POST":
        group_form = GroupForm(request.POST)

        if group_form.is_valid():
            group_name = group_form.cleaned_data.get('group_name')

            if Group.objects.filter(group_name=group_name).exists:

                messages.error(request, 'this group already exists')

            else:
                group_form.save()
                messages.success(request, 'Group created')

        return redirect('group_list')

    return render(request, 'imports/group_create.html', {
        "group_form": group_form,
    })

我的模特:

class Group(models.Model):
    group_id = models.AutoField(primary_key=True)
    groupParent_id = models.ForeignKey('self', blank=True, null=True, related_name='Parent', on_delete=models.CASCADE)
    group_name = models.CharField(max_length=100, null=False, blank=False, unique=True)

我的html:

<div class="container-fluid">

<!-- Code pour message type toaster -->
            {% if messages %}
                <div class="row">
                    <div class="col-xs-12">

                        <ul class="alert" role="alert">
                            {% for message in messages %}
                            <p {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</p>
                            {% endfor %}
                        </ul>
                    </div>
                </div>
            {% endif %}
<!-- fin messages -->

    <div class="row">
        <div class="col-lg-2 col-md-2 col-sm-2 sidebar">
             {%  block sidebar %}{%  endblock %}
        </div>
        <div class="col-lg-10 col-lg-offset-2 col-md-10 col-md-offset-2 col-sm-10 col-sm-offset-2 content">
                {% block heading %}{% endblock %}
                {%  block page %}{% endblock %}
        </div>
    </div>

</div>

1 个答案:

答案 0 :(得分:0)

Django的ModelForm [Django-doc]已经验证了标记为unique=True [Django-doc]的字段的唯一性,正如documentation on Interaction with model validation [Django-doc]中指定的那样:

  

(...)

     

在任何唯一性之前,模型的clean()方法将被称为   进行检查。 (...)。

如果该字段无效,则它将错误添加到group_form.errors [Django-doc]中。之所以看不到它们,是因为无论表单是否有效,您都只能重定向到视图,从而丢弃该表单。

如果您相应地呈现表单,它将向带有错误的字段中添加额外的消息:

def group_create(request):
    if request.method == "POST":
        group_form = GroupForm(request.POST)
        if group_form.is_valid():
            group_form.save()
            messages.success(request, 'Group created')
            # only in case of success
            return redirect('group_list')
    else:
        group_form = GroupForm()

    return render(request, 'imports/group_create.html', {
        "group_form": group_form,
    })