簡體   English   中英

Django默認上下文變量

[英]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的模板。

您可以使用UpdateViewDeleteView進行相同UpdateView ,它們非常相似。 實際上,大多數表單處理代碼都來自FormMixin類。

創建自己的視圖並繼承Django的通用視圖時,您會發現有時無法使用視圖,但可以使用混合包(例如FormMixinModelFormMixin )。

因此,模板中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM