## 11.4 理解如何添加Django表单实例属性
有时在一个Django的表单的clean(),clean_Foo()或者save()方法中,我们需要有更多的表单实例属性可用。一个有着request.user可用对象的样本案例就符合如上所说。这有一个简单的品酒师例子:
首先,这个表单:
EXAMPLE 11.4from django import formsfrom .models import Tasterclass TasterForm(forms.ModelForm):class Meta:model = Tasterdef __init__(self, *args, **kwargs):# set the user as an attribute of the form# 设置使用者作为表单的一个属性self.user = kwargs.pop('user')super(TasterForm, self).__init__(*args, **kwargs)
观察我们为何在调用super()之前设置self.user,并且从kwargs调用它呢?Christoper Lambacher向我们指出,这会使我们的表单更加的稳定,尤其是当你使用多重继承的时候。现在的视图:
EXAMPLE 11.5from django.views.generic import UpdateViewfrom braces.views import LoginRequiredMixinfrom .forms import TasterFormfrom .models import Tasterclass TasterUpdateView(loginRequredMixin, Updateview):model = Tasterform_class = Taster Formsuccess_url = "/someplace/"def get_form_kwargs(self):"""This method is what injects forms with their keyword arguments.""""""通过他们的关键字参数注入表单"""# garb the current set of form #kwargs# 获取当前表单 #kwargs的设定kwargs = super(TasterUpdateView,self).get_form_kwargs()# Update the kwargs with the user_id# 通过user_id更新kwargskwargs['user'] = self.request.userreturn kwargs
扩展包提示:django-braces的模型表单混合(Mixins)
如果经常插入request.user对象到表单的话,那么django-braces能够帮你去完成。不过,当你需要添加的不是request.user对象时,去了解它如何工作是非常有帮助的。
http://django-braces.readthedocs.org/en/latest/form.html#userformkwargsmixin
http://django-braces.readthedocs.org/en/latest/form.html#userkwargmodelformmixin
