## 11.4 理解如何添加Django表单实例属性


    有时在一个Django的表单的clean(),clean_Foo()或者save()方法中,我们需要有更多的表单实例属性可用。一个有着request.user可用对象的样本案例就符合如上所说。这有一个简单的品酒师例子:

    首先,这个表单:

    1. EXAMPLE 11.4
    2. from django import forms
    3. from .models import Taster
    4. class TasterForm(forms.ModelForm):
    5. class Meta:
    6. model = Taster
    7. def __init__(self, *args, **kwargs):
    8. # set the user as an attribute of the form
    9. # 设置使用者作为表单的一个属性
    10. self.user = kwargs.pop('user')
    11. super(TasterForm, self).__init__(*args, **kwargs)

    观察我们为何在调用super()之前设置self.user,并且从kwargs调用它呢?Christoper Lambacher向我们指出,这会使我们的表单更加的稳定,尤其是当你使用多重继承的时候。现在的视图:

    1. EXAMPLE 11.5
    2. from django.views.generic import UpdateView
    3. from braces.views import LoginRequiredMixin
    4. from .forms import TasterForm
    5. from .models import Taster
    6. class TasterUpdateView(loginRequredMixin, Updateview):
    7. model = Taster
    8. form_class = Taster Form
    9. success_url = "/someplace/"
    10. def get_form_kwargs(self):
    11. """This method is what injects forms with their keyword arguments."""
    12. """通过他们的关键字参数注入表单"""
    13. # garb the current set of form #kwargs
    14. # 获取当前表单 #kwargs的设定
    15. kwargs = super(TasterUpdateViewself).get_form_kwargs()
    16. # Update the kwargs with the user_id
    17. # 通过user_id更新kwargs
    18. kwargs['user'] = self.request.user
    19. 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