首页 > 解决方案 > Django模板中'form.as_p'中的值'form'从何而来?

问题描述

我知道之前有人问过这个问题,但接受的答案并没有真正回答这个问题: django 模板中的 `form.as_p` 来自哪里?

在 Django 文档中:

示例 myapp/views.py:

from django.views.generic.edit import CreateView
from myapp.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

示例 myapp/author_form.html:

<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

问题是,模板从哪里获取“表单”上下文,因为我们没有在 AuthorCreate 类中明确定义 render() 函数?谢谢。

标签: djangodjango-viewsdjango-templates

解决方案


我找到了答案。

CreateView继承类的get方法和类的方法。ProcessFormViewget_context_dataFormMixin

正如您在代码中看到的那样,该get方法返回一个调用get_context_data.

class ProcessFormView(View):
    """Render a form on GET and processes it on POST."""
    def get(self, request, *args, **kwargs):
        """Handle GET requests: instantiate a blank version of the form."""
        return self.render_to_response(self.get_context_data())

反过来,如果 key 中不存在get_context_data关键字参数,则添加它:form**kwargs

class FormMixin(ContextMixin):
...
    def get_context_data(self, **kwargs):
        """Insert the form into the context dict."""
        if 'form' not in kwargs:
            kwargs['form'] = self.get_form()
        return super().get_context_data(**kwargs)

因此CreateView,使用具有“表单”键和指向ModelForm.


推荐阅读