前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >How to access the HttpRequest object in Django forms( Django view 给 forms 传递数据)

How to access the HttpRequest object in Django forms( Django view 给 forms 传递数据)

作者头像
卓越笔记
发布2023-02-18 14:48:22
发布2023-02-18 14:48:22
40300
代码可运行
举报
文章被收录于专栏:卓越笔记卓越笔记
运行总次数:0
代码可运行

Example 1:

PASSING THE REQUEST OBJECT TO THE FORM

In your view, when you create a form instance, pass the request object as a parameter. Here I used a parameter named request.

代码语言:javascript
代码运行次数:0
复制
form = MyForm(request.POST, request.FILES, request=request)

ACCESSING THE REQUEST OBJECT IN THE FORM

In your form, use the __init__ method to assign the request object to a variable. Here I used self.request.

代码语言:javascript
代码运行次数:0
复制
class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(MyForm, self).__init__(*args, **kwargs)

FORM VALIDATION

Now we can use the self.request variable to access the request object inside of our form methods.

In the following example, I used the self.request variable to check if the name of the currently logged user is different from the value of the ‘name’ field.

代码语言:javascript
代码运行次数:0
复制
class MyForm(forms.ModelForm):
    # Use self.request in your field validation
    def clean_name(self):
        if self.cleaned_data['name'] != self.request.user.name:
            raise forms.ValidationError("The name is not the same.")
        return self.cleaned_data['name']

Example 2:

As ars and Diarmuid have pointed out, you can pass request.user into your form, and use it in validating the email. Diarmuid's code, however, is wrong. The code should actually read:

代码语言:javascript
代码运行次数:0
复制
from django import forms

class UserForm(forms.Form):
    email_address = forms.EmailField(widget = forms.TextInput(attrs = {'class':'required'}))

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(UserForm, self).__init__(*args, **kwargs)

    def clean_email_address(self):
        email = self.cleaned_data.get('email_address')
        if self.user and self.user.email == email:
            return email
        if UserProfile.objects.filter(email=email).count():
            raise forms.ValidationError(u'That email address already exists.')
        return email

Then, in your view, you can use it like so:

代码语言:javascript
代码运行次数:0
复制
def someview(request):
    if request.method == 'POST':
        form = UserForm(request.POST, user=request.user)
        if form.is_valid():
            # Do something with the data
            pass
    else:
        form = UserForm(user=request.user)
    # Rest of your view follows

From:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-5-26 0,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Example 1:
    • PASSING THE REQUEST OBJECT TO THE FORM
    • ACCESSING THE REQUEST OBJECT IN THE FORM
    • FORM VALIDATION
  • Example 2:
  • From:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档