How to access the HttpRequest object in Django forms

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.

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.

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.

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']

Django Forms – The difference between self.cleaned_data[‘field’], self.cleaned_data.get(‘field’) and self.data

By understanding how the attributes self.cleaned_data and self.data work and how to get its values, you can control and use them efficiently in your forms.

Defining the form

This is a simple ModelForm example for a model named Car.

I created the clean_price method to change the original format of the price field that will be passed to the form. This is particularly important, because it’s a key to understand the difference between self.cleaned_data and self.data.

class CarForm(ModelForm):

    price = forms.CharField(max_length=20)

    class Meta:
        model = Car
        fields = ['name','brand','color','price']

    def clean_price(self):
        price = self.cleaned_data['price']
        price = re.sub('[.]', '', price)
        price = re.sub('[,]', '.', price)
        return price

Passing data to the form

The first thing to do is to create a dictionary and pass to the form as the first parameter.

>>> data = {'name': 'Focus',
    'brand': 'Ford',
    'color': 'Blue',
    'price': '17.000,00'}
>>> f = CarForm(data)

What is self.data?

self.data is simply the original data passed to the form. So it will return the original data:

>>> f.data
{'color': 'Blue', 'brand': 'Ford', 'price': '17.000,00', 'name': 'Focus'}
>>> f.data.get('price')
'17.000,00'
>>> f.data['price']
'17.000,00'

What is self.cleaned_data?

self.cleaned_data is an dictionary that receives all cleaned and validated data after calling the is_valid() method.

At this point, if we try to access the cleaned_data attribute, an AttributeError will be raised.

>>> f.cleaned_data
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'CarForm' object has no attribute 'cleaned_data'

This happened because the cleaned_data attribute is created when we call the is_valid() method. After calling the is_valid() method, we have access to the cleaned_data attribute.

>>> f.is_valid()
True
>>> f.cleaned_data
{'color': u'Blue', 'brand': u'Ford', 'price': u'17000.00', 'name': u'Focus'}

And, of course, we also have access to the original data passed to the form. Now, we can see the original and modified price after validation by the clean_price method:

>>> f.data
{'color': 'Blue', 'brand': 'Ford', 'price': '17.000,00', 'name': 'Focus'}
>>> f.data.get('price')
'17.000,00'
>>> f.cleaned_data.get('price')
u'17000.00'

The difference between self.cleaned_data[‘field’] and self.cleaned_data.get(‘field’)

cleaned_data is a Python dictionary and an attribute of the form object. As a Python dictionary, you can access its values by:

  • Specifying the key between [ ]: self.cleaned_data[‘field’]
  • Using get() method: self.cleaned_data.get(‘field’)

The difference between these two approaches is that if the key does not exists, self.cleaned_data[‘field’] will raise a KeyError, while self.cleaned_data.get(‘field’) will return None.

As you can see in the example below, the get() method also allows us to specify a default value if the key does not exists:

>>> f.cleaned_data['size']
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 'size'
>>> f.cleaned_data.get('size')
>>> f.cleaned_data.get('size', 'Data unavailable')
'Data unavailable'

Como criar um ambiente virtual Linux para desenvolvimento – Tutorial passo a passo para iniciantes

Instalar diversos pré-requisitos e ferramentas de desenvolvimento e banco de dados no seu Sistema Operacional, ou implementar dual boot para manter dois Sistemas Operacionais, tem as suas desvantagens como gastos de recursos de máquina e ambiente engessado.

Por exemplo, utilizo uma máquina virtual com 512 MB de memória que uso constantemente. Nela desenvolvo sem problemas aplicativos em Python/Django e PHP/Yii, com bancos de dados PostgreSQL e MySQL. Não preciso sobrecarregar meu Sistema Operacional com diversas instalações para suportar a linguagem ou banco de dados e nem preciso reiniciar o computador caso a troca de ambiente seja necessária.

Não só desenvolvedores podem beneficiar de ter um ambiente virtual Linux, mas também aqueles que querem estudar o Linux e/ou testar comandos.

READ MORE