как проверить купон с помощью django framework и sqlite?

#python #html #django #sqlite

#python #HTML #django #sqlite

Вопрос:

итак, моя основная идея заключается в том, что когда студент вводит купон, предоставленный его учебным заведением, система должна проверить, существует ли купон в базе данных или нет, и отобразить сообщение о том, что купон проверен, если он есть в базе данных, но на самом деле появляется сообщение «Список ошибок», в котором говорится, чтокупон уже завершается в базе данных, и мое настроенное сообщение никогда не появляется

это моя функция просмотра

 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 amp; 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 %}
  

это функция views, которую я использую для добавления нового купона в базу данных

 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})
  

это моя форма для добавления купона в БД

 # 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',)
  

я перепробовал все ответы, и он продолжает показывать это сообщение в браузере
снимок экрана моего браузера, где моя главная проблема заключается

в том, что вместо сообщения, которое я хочу, это это messages.info(request, 'Your coupon is verified!')

если вам что-то непонятно в моем вопросе, пожалуйста, дайте мне знать, и я проясню это для вас, я просто в отчаянии

Комментарии:

1. is_active = Coupon.objects.get(active=True).exists() это будет верно, если есть какие-либо активные Coupon объекты. Вам нужно получить купон, затем проверить его : current_coupon = Coupon.objects.get(code=current_code) . if current_coupon.active ...

2. Используйте is_available = Coupon.objects.filter(code=code_entered, active=True). first().exists() . Вам, вероятно, не нужна переменная is_active

3. @mobiusxs я попробовал ваш ответ, но вместо этого он по-прежнему выдает мне это сообщение в браузере: `Код: купон с этим кодом уже существует. «`

4. @dishantmakwana я попробовал ваш ответ, но вместо этого он по-прежнему выдает мне это сообщение в браузере: `Код: купон с этим кодом уже существует. «`

5. Можете ли вы опубликовать свой обновленный код?

Ответ №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 False делает то же самое, is_available что и, извлекает активный атрибут, если есть объект, и устанавливает False значение, если ничего нет

Комментарии:

1. я попробовал ваш ответ, но он по-прежнему выдает мне это сообщение в браузере вместо « Code: купон с этим кодом уже существует. «`

2. @MarwaAbdElBasit Уже существует возникает в случае, если вы создаете объект в поле, для которого установлен unique атрибут True , и объект уже используется, он не возникает из этого ответа, потому что этот ответ предназначен для вызова купонов, а не для создания купонов. Опубликуйте код, в котором вы создаете купоны.

3. я отредактировал свой вопрос и поместил свою функцию views, используемую для добавления купона в базу данных

Ответ №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 amp; is_active:
    messages.info(request, 'Your coupon is verified!')
else:
    messages.info(request, 'Your coupon is not verified!')
    
  

Комментарии:

1. DoesNotExist не определено, оно должно быть Coupon.DoesNotExist .

2. Да, извините, что это ObjectDoesNotExist с импортом…

3. @Renaud я попробовал ваш ответ, но он по-прежнему выдает мне это сообщение в браузере вместо « Код: купон с этим кодом уже существует. «`