Django: Accessing request in forms.py clean function

谁都会走 提交于 2019-11-27 01:55:21

问题


Hi Stackoverflow people,

In my clean function in forms.py, I would like to save automatically some information in a session variable. However, I do not seem to get access to the request variable.

All examples for handing over the request variable are based on function based views, but here I am using a class based view.

My forms.py:

from django import forms
from item.models import Item

class CreateItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('name', 'description')

    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(CreateItemForm, self).__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super(CreateItemForm, self).clean()
        if cleaned_data.get("address"):
            self.request.session['name'] = cleaned_data.get("name") 
        else:
            raise forms.ValidationError(_('Oops, can\'t find location.'))
        return self.cleaned_data

My views.py:

from django.views.generic.edit import FormView
from item.forms import CreateItemForm

class ItemCreate(FormView):
    form_class = CreateItemForm 
    template_name = 'item/item_create.html' 
    success_url = 'http://www.google.com'

What is the best way to hand over the request variable from the views.py to forms.py?

Thank you for your answer.


回答1:


You can overwrite the FormMixin's get_form_kwargs method to add the request for to the form's init parameters:

class ItemCreate(FormView):
     def get_form_kwargs(self):
         kwargs = super(ItemCreate, self).get_form_kwargs()
         kwargs.update({
             'request' : self.request
         })
         return kwargs



回答2:


Overriding the form.get_initial() works for me

class ItemCreate(FormView):
    def get_initial(self):
        init = super(ItemCreate, self).get_initial()
        init.update({'request':self.request})
        return init

And in the clean we can access it with form.initial dict

class sampleForm(forms.Form):
    ...
    ...
    def clean(self):
    user_request = self.initial['request']

By the way, we don't need to pop the extra args like suggested above.



来源:https://stackoverflow.com/questions/12064000/django-accessing-request-in-forms-py-clean-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!