Django:访问forms.py clean函数中的请求

时间:2012-08-21 22:31:27

标签: django django-forms request django-class-based-views

嗨Stackoverflow人,

在forms.py中的clean函数中,我想在会话变量中自动保存一些信息。但是,我似乎无法访问请求变量。

移交请求变量的所有示例都基于基于函数的视图,但在这里我使用的是基于类的视图。

我的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

我的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'

将views.py中的request变量移交给forms.py的最佳方式是什么?

感谢您的回答。

2 个答案:

答案 0 :(得分:17)

您可以覆盖FormMixin的{​​{3}}以将请求添加到表单的init参数中:

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

答案 1 :(得分:0)

覆盖form.get_initial()适合我

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

在清洁中我们可以使用form.initial dict

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

顺便说一下,我们不需要像上面提到的那样弹出额外的args。