【问题标题】:Django: Accessing request in forms.py clean functionDjango:在 forms.py clean 函数中访问请求
【发布时间】:2012-08-17 08:06:48
【问题描述】:

你好 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

我的意见.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'

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

感谢您的回答。

【问题讨论】:

  • 您可以将它传递给 init,将其分配给 self.request,然后从 clean 中访问它。
  • 我曾尝试将form_class = CreateItemForm 替换为form_class = CreateItemForm(request),但这会导致更多问题。还是您的意思是不同的解决方案?
  • 我在this stackoverflow link.中解释了一种更简单的解决方案
  • 我已经发布了一个更简单的解决方案in this StackOverflow link.

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


【解决方案1】:

覆盖 form.get_initial() 对我有用

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

在 clean 中我们可以使用 form.initial dict 访问它

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

顺便说一句,我们不需要像上面建议的那样弹出额外的参数。

【讨论】:

    【解决方案2】:

    您可以覆盖FormMixinget_form_kwargs method 以将请求添加到表单的初始化参数中:

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

    【讨论】:

    • 我已将该方法添加到基于类的视图中,但随后表单的__init__() method 抛出以下错误__init__() got an unexpected keyword argument 'request'。你知道为什么吗?
    • request 应该是关键字 arg:def __init__(self, request=None, *args, **kwargs):
    • 应该和UpdateView一样吗?我尝试添加您修改后的get_form_kwargs,但我得到了name 'request' is not defined
    猜你喜欢
    • 2012-01-28
    • 2020-01-25
    • 2018-10-18
    • 1970-01-01
    • 2011-09-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多