Python Django:验证GET参数
我在结账时提供折扣代码。我创建了一个表单,用户可以在其中键入折扣代码并单击apply。表单检查折扣代码是否有效,然后应用它 现在我想添加要添加到url domain.com/event/?discount=ABC的功能 我想检查是否设置了Python Django:验证GET参数,python,django,Python,Django,我在结账时提供折扣代码。我创建了一个表单,用户可以在其中键入折扣代码并单击apply。表单检查折扣代码是否有效,然后应用它 现在我想添加要添加到url domain.com/event/?discount=ABC的功能 我想检查是否设置了request.GET,然后以某种方式将其重定向到“表单”/将其转换为request.POST,以便验证它。我目前正在努力找到正确的方法来做到这一点。对于如何使用GET参数并以与使用表单相同的方式验证它,您有什么建议吗 views.py def dispatch
request.GET
,然后以某种方式将其重定向到“表单”/将其转换为request.POST
,以便验证它。我目前正在努力找到正确的方法来做到这一点。对于如何使用GET参数
并以与使用表单相同的方式验证它,您有什么建议吗
views.py
def dispatch(self, request, *args, **kwargs):
# Provide discount_code to all functions
self.discount_code = None
# Check if discount code is saved as a session
self.discount_code_session = request.session.get(
request.event.discount_code_cookie(), None)
if self.discount_code_session:
self.discount_code = Discount.objects.filter(
code=self.discount_code_session,
event=self.request.event.pk
).first()
@transaction.atomic
def post(self, request, *args, **kwargs):
# Discount Code
if self.discount_form.is_valid():
discount_code = self.discount_form.cleaned_data['code']
request.session[request.event.discount_code_cookie()] = discount_code
return redirect('events:detail', request.organizer.slug, request.event.slug)
forms.py
class DiscountFormEventPage(forms.ModelForm):
# Remove required attribute from HTML elements
use_required_attribute = False
class Meta:
model = Discount
fields = (
'code',
)
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
super().__init__(*args, **kwargs)
for visible_field in self.visible_fields():
visible_field.field.widget.attrs['class'] = 'form-control'
def clean_code(self):
input_code = self.cleaned_data['code']
# Check if discount code exists
discount_code = self.event.discounts.filter(code=input_code).first()
if not discount_code:
raise forms.ValidationError(_("The discount code couldn't be found."),
code='code_exists')
elif not discount_code.is_active():
raise forms.ValidationError(_("This discount code is not available\
anymore."),
code='code_not_active')
return input_code
更新:
我现在在my view.py(DetailView)中添加了以下内容:
我看不出你从哪里得到参数,这是你的问题吗?您可以通过以下方式获得:
# request.GET is a dict-like object
code = request.GET['discount']
# safer alternative against KeyError
code = request.GET.get('discount')
# if discount may be specified multiple times
code = request.GET.getlist('discount')
如果要使用表单验证传入数据,应能够将其作为第一个参数传递:
form = DiscountFormEventPage(request.GET)
if form.is_valid():
data = form.cleaned_data
return redirect('events:detail', request.organizer.slug, request.event.slug)
我现在可以用这个代码解决它。感谢布鲁诺帮助我找到正确的轨道:
def get(self, request, *args, **kwargs):
# Apply discount via GET parameter ?code=DISCOUNT
discount_code_get = request.GET.get('code')
if discount_code_get:
self.discount_form = DiscountFormEventPage(
data=request.GET,
event=self.request.event,
)
if self.discount_form.is_valid():
discount_code = self.discount_form.cleaned_data['code']
request.session[request.event.discount_code_cookie()] = discount_code
return redirect('events:detail', request.organizer.slug, request.event.slug)
return super().get(request, *args, **kwargs)
你好,布鲁诺,谢谢你的回答。我试图添加它,但是我总是收到错误信息“DiscountFormEventPage”对象没有属性“get”。我附加了我在上面添加的内容。@jonbrogrammer视图应该返回响应,而不是表单本身:好的,明白了。我现在的问题是,我将值“插入”到折扣表单输入字段中。但为了“发送”它,我仍然必须单击Submit。我的想法是在输入字段中键入它,或者如果它已经在get参数中,我希望在不单击提交的情况下将表单发送到验证。
def get(self, request, *args, **kwargs):
# Apply discount via GET parameter ?code=DISCOUNT
discount_code_get = request.GET.get('code')
if discount_code_get:
self.discount_form = DiscountFormEventPage(
data=request.GET,
event=self.request.event,
)
if self.discount_form.is_valid():
discount_code = self.discount_form.cleaned_data['code']
request.session[request.event.discount_code_cookie()] = discount_code
return redirect('events:detail', request.organizer.slug, request.event.slug)
return super().get(request, *args, **kwargs)