Переменная контекста django по умолчанию - PullRequest
1 голос
/ 06 марта 2019

Я новичок в Django web dev, мне удалось настроить игрушечный проект, следуя этому учебнику .

Однако я обнаружил, что официальная документация 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, но ничего не нашел.

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Вы используете общие представления на основе классов, которые имеют много встроенных функций. Лучший источник для их поиска - этот .

Если вы посмотрите нанапример, CreateView (Edit -> CreateView), вы увидите, что метод get(), который является первым методом, вызываемым, когда вы просто выбираете страницу с помощью GET, просто вызывает render_to_response() с данными контекста, полученными из get_context_data().

А внутри get_context_data() мы добавляем контекстную переменную form к контексту, который присвоен get_form().и т. д.

То же самое с методом post(), где сначала извлекается form, проверяется на достоверность и, если не действителен, метод form_invalid() визуализирует шаблон с form в егоcontext.

Вы можете следовать тому же с UpdateView и DeleteView, они очень похожи.Большая часть кода обработки форм на самом деле происходит из класса FormMixin.

Когда вы создаете свои собственные представления, подклассифицируя общие представления Django, вы обнаружите, что иногда вы не можете использовать представление, но вы можете использоватьmixins (например, FormMixin или ModelFormMixin).

Таким образом, form в вашем шаблоне - это ModelForm для Author модели, которую вы указали в общих представлениях.Представление автоматически генерирует эту форму из модели, используя modelform_factory с полями, которые вы указали с помощью fields.Так как он добавлен как ключ 'form' к контексту, используемому для визуализации шаблона, вы можете получить к нему доступ с помощью {{ form }}.{{ form.as_table }} отобразит HTML для этой формы в <table>, как описано здесь .

Если вам не нравится, как выглядит форма, и вы хотите настроить некоторые поля (и не можете сделать это, просто изменив шаблон), вам нужно будет создать собственную форму, сообщитепосмотрите на это, установив атрибут form_class и удалив атрибут fields (поля будут указаны в вашей форме), как описано @drew в своем ответе.

2 голосов
/ 06 марта 2019

«Форма» - это переменная, которую вам нужно передать из вашего представления в шаблон.

Вы должны создать файл 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

...