[英]django default context variable
我是Django Web開發人員的新手,根據本教程設法建立了一個玩具項目。
但是,我發現Django官方文檔以及本教程非常混亂,我很難遵循,尤其是模板上下文變量 。
例如,在xxapp/views.py
我們定義了以下幾個視圖,
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from catalog.models import Author
class AuthorCreate(CreateView):
model = Author
fields = '__all__'
initial = {'date_of_death': '05/01/2018'}
class AuthorUpdate(UpdateView):
model = Author
fields = ['first_name', 'last_name', 'date_of_birth', 'date_of_death']
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('authors')
然后在模板中,我們有
{% extends "base_generic.html" %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
<table>
{{ form.as_table }} <!-- WHERE IS THIS "FORM" FROM? -->
</table>
<input type="submit" value="Submit">
</form>
{% endblock %}
我了解此模板文件,除了一件事之外, form.as_table
來源是什么,它是什么?
我知道,如果我們使用一些內置的類視圖或模型,則可能會免費獲得一些上下文數據,但是在哪里查找它們,我在Django上進行了搜索,但一無所獲。
“ form”是您需要從視圖傳遞到模板的變量。
您應該創建一個forms.py文件來設置所有表單。
在此文件中,您將創建一個簡單的表單,如下所示:
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
然后在您看來,您應該導入表單,然后將“ form”變量設置為:
form = NameForm()
或者,如果您已發布數據:
form = NameForm(request.POST)
因此,一旦將此變量傳遞給模板,就可以像使用“ form.as_table”一樣調用整個表單。
或者,您可以調用單個表單字段,例如:
{{ form.your_name.label }}
{{ form.your_name }}
{{ form.your_name.errors }}
有關更多信息,請參見Django網站上的此幫助文檔: https : //docs.djangoproject.com/en/2.1/topics/forms/#the-form-class
您使用的是基於類的通用視圖,其中包含許多功能。查找它們的最佳來源是此視圖。
如果以CreateView
為例(編輯-> CreateView),您會看到get()
方法(這是您僅使用GET來獲取頁面時調用的第一個方法render_to_response()
,只是調用了render_to_response()
並獲取了上下文數據來自get_context_data()
。
在get_context_data()
內部,我們向上下文添加一個form
上下文變量,該變量分配給get_form()
。 等等...
與post()
方法相同,在post()
方法中,首先獲取form
,檢查其有效性,如果無效,則form_invalid()
方法在其上下文中呈現帶有form
的模板。
您可以使用UpdateView
和DeleteView
進行相同UpdateView
,它們非常相似。 實際上,大多數表單處理代碼都來自FormMixin
類。
創建自己的視圖並繼承Django的通用視圖時,您會發現有時無法使用視圖,但可以使用混合包(例如FormMixin
或ModelFormMixin
)。
因此,模板中的form
就是您在常規視圖中指定的Author
模型的ModelForm
。 該視圖正在使用modelform_factory
從模型中自動生成該表單,並使用fields指定了fields
。 由於已將其作為'form'
鍵添加到用於渲染模板的上下文中,因此您可以使用{{ form }}
訪問它。 {{ form.as_table }}
將呈現在這種形式的HTML <table>
如所描述這里 。
如果您不喜歡表單的外觀並想要自定義某些字段(並且不能僅通過更改模板來做到這一點),則需要創建自己的表單,並通過設置form_class
屬性並刪除fields
屬性(字段將在您的表單中指定),如@drew在其響應中所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.