Python Django:验证GET参数

Python Django:验证GET参数,python,django,Python,Django,我在结账时提供折扣代码。我创建了一个表单,用户可以在其中键入折扣代码并单击apply。表单检查折扣代码是否有效,然后应用它 现在我想添加要添加到url domain.com/event/?discount=ABC的功能 我想检查是否设置了request.GET,然后以某种方式将其重定向到“表单”/将其转换为request.POST,以便验证它。我目前正在努力找到正确的方法来做到这一点。对于如何使用GET参数并以与使用表单相同的方式验证它,您有什么建议吗 views.py def dispatch

我在结账时提供折扣代码。我创建了一个表单,用户可以在其中键入折扣代码并单击apply。表单检查折扣代码是否有效,然后应用它

现在我想添加要添加到url domain.com/event/?discount=ABC的功能

我想检查是否设置了
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)