【问题标题】:Already Exist error in DJANGO even it's unique in HTMLDJANGO 中已经存在错误,即使它在 HTML 中是独一无二的
【发布时间】:2019-03-28 21:16:47
【问题描述】:

我在 DJANGO 中创建了一个模型表单,但在插入值以填充模型时,我的 html 文件中出现错误 Coupons with this Valid coupons already exists.

我有两个模型:

class Coupons(models.Model):
    valid_coupons = models.CharField(max_length=5,unique=True)

    def __str__(self):
        return self.valid_coupons

class ChapterParticipated(models.Model):
    code = models.ForeignKey(Coupons,unique=True,on_delete=models.PROTECT)
    ChapterName = models.CharField(max_length=264)
    TeamName = models.CharField(max_length=264)

    def __str__(self):
        return self.code

我的 view.py 包含:

from django.shortcuts import render
from first_app.forms import NewUserForm
# Create your views here.
def index(request):
    form = NewUserForm()

    if request.method == "POST":
        form = NewUserForm(request.POST)

        if form.is_valid():
            form.save(commit=True)
            return index(request)
        else:
            print('ERROR FORM INVALID')

    return render(request,'firstapp/firstapp.html',{'form':form})

我的 forms.py 包含:

from django import forms
from first_app.models import Coupons

class NewUserForm(forms.ModelForm):
    class Meta():
        model = Coupons
        fields = '__all__'

当我在输入字段中输入值并单击提交按钮时会发生什么

带有此有效优惠券的优惠券已存在。

并将输入添加到表中,但仍然显示该错误。

【问题讨论】:

    标签: python html django django-models


    【解决方案1】:

    由于模型Coupons 中的字段valid_coupons 具有unique=True 属性,因此Django 引发异常,即模型Coupons 的值为valid_coupons 的对象已存在。

    我不知道是否有意让valid_coupons 字段唯一,但如果您将unique 删除或更改为False,它应该可以工作。

    如果有意将其设置为True,那么……不保存已经存在的值?

    编辑:正如我在下面的评论中指出的那样,空值也是唯一值,这意味着仅仅因为您将 valid_coupons 的值留空并不意味着您可以绕过unique 属性。

    如果您想为valid_coupons 的每个实例存储随机值,您可以覆盖Coupons 模型中的保存方法,如下所示:

    import uuid
    
    class Coupons(models.Model):
        ...
    
        def save(self, *args, **kwargs):
            # Only do this part if the PK is not set yet
            if self.pk is None:
                # Generate a random string for valid_coupons
                self.valid_coupons = uuid.uuid4().hex[:5].upper()
                # TODO: Make sure this code is unique somehow
            # Call the super
            super().save(*args, **kwargs) 
    

    我包含了来自this answer 的随机代码生成,但您应该寻求实现自己的解决方案。此外,上面的代码不会检查重复项,而是依赖于通过随机化代码不会产生任何冲突。 这是一种幼稚的方法,您应该在调用super 方法之前检查是否有重复项。

    【讨论】:

    • 但 valid_coupons 是一个列名,它只需要存储唯一值如何实现?
    • valid_coupons的值怎么设置?空值也是唯一值,这意味着只有Coupons 的一个模型可以有空值。
    • 是的,我不想在 valid_coupons 中保存重复值
    • 我正在使用 forms.model 创建用于存储数据的自动表单
    • @MansiShukla 我已经用适合您的解决方案的方法更新了我的答案。
    【解决方案2】:

    对我来说,它是这样工作的 我在models.py(Types_List)中有一个类,在forms.py(Types_form)中有另一个类。 “base/add.html”地址中还有一个 HTML 文件。我在views.py 中的代码是:

    def add(response):
       form = Types_form(response.POST or None)
       if form.is_valid():
           n = form.cleaned_data['type_name'] 
           if Types_List.objects.filter(type_name=n).exists():
               form.message = 'Erorr: Duplicated!".'
           else:
               t = Types_List(type_name=n)
               t.save()
    
       return render(response, "base/add.html", {"form":form})
    

    为了更清楚地说明,“response.POST or None”会阻止函数始终发送帖子,即使您仅打开页面也是如此。 "cleaned_data" 对 "form" 字典进行解密,您可以通过密钥调用它们。

    “filter(type_name=n).exists()”验证“Types_List”中是否存在“type_name”。如果有任何类似的内容,一个字符串将保存到“form.message”中,您可以在HTML文件中简单地调用它,如下所示:

    <div>
      {{ form.message }}
      <form method="post" action="{% url 'add' %}">
          {{form}}
          {% csrf_token %}
          <button type="submit" name="Add">Add</button>
      </form>
    </div>
    

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2019-11-17
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2011-10-23
      • 2018-08-30
      相关资源
      最近更新 更多