#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 я попробовал ваш ответ, но он по-прежнему выдает мне это сообщение в браузере вместо « Код: купон с этим кодом уже существует. «`