13

Stackoverflow の皆さん、こんにちは。

forms.py のクリーン関数で、いくつかの情報をセッション変数に自動的に保存したいと考えています。ただし、リクエスト変数にアクセスできないようです。

リクエスト変数を渡す例はすべて関数ベースのビューに基づいていますが、ここではクラス ベースのビューを使用しています。

私の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'

request変数をviews.pyからforms.pyに引き渡す最良の方法は何ですか?

ご回答ありがとうございます。

4

2 に答える 2

18

FormMixinget_form_kwargsメソッドを上書きして、フォームの init パラメータにリクエストを追加できます。

class ItemCreate(FormView):
     def get_form_kwargs(self):
         kwargs = super(ItemCreate, self).get_form_kwargs()
         kwargs.update({
             'request' : self.request
         })
         return kwargs
于 2012-08-21T22:36:32.267 に答える
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']

ところで、上記のように余分な引数をポップする必要はありません。

于 2017-09-11T17:54:38.407 に答える