【问题标题】:how to verify a coupon using django framework and sqlite?如何使用 django 框架和 sqlite 验证优惠券?
【发布时间】:2021-01-19 15:00:55
【问题描述】:

所以,我的基本想法是,当学生输入其教育机构提供的优惠券时,系统应检查该优惠券是否存在于数据库中,并显示一条消息说该优惠券是否在数据库中已验证,但实际发生的是出现“errorList”消息,说明优惠券已在数据库中退出,而我的自定义消息从未出现

这是我的意见功能

def apply_coupon(request):
    if request.method == 'POST':
        form = ApplyCouponForm(request.POST)
        if form.is_valid():
            # code_entered = request.POST.get('code')
            code_entered = form.cleaned_data['code']
            coupon = Coupon.objects.filter(code = code_entered).first()
            is_available = True if coupon else False
            is_active = coupon.active if coupon else False
            if is_available and is_active:
                messages.info(request, 'Your coupon is verified!')
            else:
                messages.info(request, 'Your coupon is in valid!')
    else:
        form = ApplyCouponForm()
    return render(request, 'app/applyCoupon.html', {'form': form})

is_available = Coupon.objects.get(code=code_entered).exists()这行检查优惠券是否存在于数据库中

is_active = Coupon.objects.get(active=True).exists()这个检查它是否处于活动状态

if is_available & is_active:我认为这种情况永远不会成立,但我不知道为什么

这是models.py中的优惠券模型

# coupons model
class Coupon(models.Model):
    code = models.CharField(primary_key=True, max_length=50, unique=True)
    active = models.BooleanField()

    def __str__(self):
        return self.code

这是我的 html 模板

{% extends 'base_layout.html' %}

{% block content %}
<div class="applyCoupon">
  <form class="applyCoupon_form" action="{% url 'app:applyCoupon' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="verify">
  </form>
</div>
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
{% endblock %}

这是我用来向数据库添加新优惠券的视图函数

def addCoupon(request):
    if request.method == 'POST':
        form = AddCouponForm(request.POST)
        if form.is_valid():
            # save coupon to db
            form.save()
            messages.info(request, 'Your coupon has been saved successfully!')
    else:
        form = AddCouponForm()
    return render(request, 'app/addCoupon.html', {'form': form})

这是我向 db 添加优惠券的表单

# add coupon form
class AddCouponForm(forms.ModelForm):
    code = forms.CharField(max_length=4000)
    class Meta:
        model = Coupon
        fields = ('code', 'active')

这也是我验证或验证优惠券的表格

# apply coupon form
class ApplyCouponForm(forms.ModelForm):
    code = forms.CharField()
    class Meta:
        model = Coupon
        fields = ('code',)

我尝试了所有答案,但它一直在浏览器上显示此消息 a screen shot of my browser where my main problem is 而不是我想要的消息这是messages.info(request, 'Your coupon is verified!')

如果您对我的问题有任何不清楚的地方,请告诉我,我会为您澄清,我只是绝望

【问题讨论】:

  • is_active = Coupon.objects.get(active=True).exists() 如果有任何活动的Coupon 对象,这将是真的。您需要获取优惠券,然后查看:current_coupon = Coupon.objects.get(code=current_code)if current_coupon.active ...
  • 使用 is_available = Coupon.objects.filter(code=code_entered, active=True).first().exists()。你可能不需要 is_active 变量
  • @mobiusxs 我试过你的答案,但它仍然在浏览器上给我这个消息,而不是 ``` 代码:带有此代码的优惠券已经存在。 ```
  • @dishantmakwana 我试过你的答案,但它仍然在浏览器上给我这个消息,而不是 ``` 代码:带有此代码的优惠券已经存在。 ```
  • 你能发布你更新的代码吗?

标签: python html django sqlite


【解决方案1】:

因为您要在整个表上验证is_active,所以正确的做法是:

coupon = Coupon.objects.filter(code = code_entered).first()
is_available = True if coupon else False
is_active = coupon.active if coupon else False

coupon = Coupon.objects.filter(code = code_entered).first() 检索一个查询集,如果存在,则将第一个对象放入其中。

is_available = True if coupon else False 检查优惠券并分配True,如果有的话将其设置为False

is_active = coupon.active if coupon else Falseis_available 做同样的事情,如果有对象则检索活动属性,如果没有对象则设置为False

【讨论】:

  • 我试过你的答案,但它仍然在浏览器上给我这个消息,而不是```代码:带有此代码的优惠券已经存在。 ```
  • @MarwaAbdElBasit Already Exists 会引发,以防您在 unique 属性设置为 True 的字段上创建对象并且已经使用了一个对象,它不会从这个答案中引发,因为这个答案是调用优惠券,而不是创建优惠券。将代码发布到您要创建优惠券的位置。
  • 我编辑了我的问题并将我的意见功能用于向数据库添加优惠券
【解决方案2】:

也许你会通过一个实例得到更好的结果: 从 django.core.exceptions 导入 ObjectDoesNotExist ...

is_available=False
is_active=False
try:
    #create an instance if a coupon exists with the entired code
    coupon_instance= Coupon.objects.get(code=code_entered)
    is_available=True
    if coupon_instance.active:
        is_active=True
except ObjectDoesNotExist:
    is_available=False
    is_active=False

if is_available & is_active:
    messages.info(request, 'Your coupon is verified!')
else:
    messages.info(request, 'Your coupon is not verified!')
    

...

【讨论】:

  • DoesNotExist 未定义,必须是Coupon.DoesNotExist
  • 是的,很抱歉它是 ObjectDoesNotExist 与要导入的...
  • @Renaud 我试过你的回答,但它仍然在浏览器上给我这个消息,而不是 ``` 代码:带有此代码的优惠券已经存在。 ```
猜你喜欢
  • 1970-01-01
  • 2023-01-17
  • 2015-06-14
  • 1970-01-01
  • 2014-09-10
  • 2022-01-16
  • 1970-01-01
  • 2021-06-12
  • 2022-10-19
相关资源
最近更新 更多