## 11.4 理解如何添加Django表单实例属性
有时在一个Django的表单的clean(),clean_Foo()或者save()方法中,我们需要有更多的表单实例属性可用。一个有着request.user可用对象的样本案例就符合如上所说。这有一个简单的品酒师例子:
首先,这个表单:
EXAMPLE 11.4
from django import forms
from .models import Taster
class TasterForm(forms.ModelForm):
class Meta:
model = Taster
def __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.5
from django.views.generic import UpdateView
from braces.views import LoginRequiredMixin
from .forms import TasterForm
from .models import Taster
class TasterUpdateView(loginRequredMixin, Updateview):
model = Taster
form_class = Taster Form
success_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更新kwargs
kwargs['user'] = self.request.user
return 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