У меня есть ModelForm, который я хотел бы отображать в нескольких местах. Например, в ListView, под списком статей. Я могу сделать это, поставив его в get_context_data()
в ListView. Я также хотел бы отобразить форму в своем собственном шаблоне.Как написать представление на основе класса Django для отображения и представления формы из другого шаблона?
Я создал представление для формы, но не уверен, как на самом деле написать его.
я определил get_absolute_url()
в моей модели:
class Article(models.Model):
author = models.ForeignKey('auth.User')
title = models.CharField(max_length=200)
text = models.TextField()
categories = models.ManyToManyField(Category)
city = models.ForeignKey(City)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse_lazy('article', args=self.id)
Представления для самой формы:
Views.py
class ArticleSubmitView(CreateView):
model = Article
form_class = ArticleSubmitForm
# is initial necessary?
inital = {'title': '', 'text': '', 'categories': '', 'city': ''}
# success url not necessary because model has get_absolute_url
# however it does not redirect to the article
template_name = 'articles/article-submit.html'
# handle post data from other template/view
# ???
Шаблона включает в себя форму (то же самое для шаблон ListView).
article-submit.html
{% extends 'articles/base.html' %}
{% block article-submit %}
{% include 'articles/article-form.html' %}
{% endblock article-submit %}
Форма представляет URL-адрес, который вызывает CreateView:
article-form.html
<form action="{% url 'article-submit' %}" method="POST">
{% csrf_token %}
{% for field in form %}
<!--- etc. --->
{% endfor %}
</form>
urls.py
from django.conf.urls import url
from .views import ArticlesView, ArticleSubmitView
urlpatterns = [
url(r'^$', ArticlesView.as_view(), name='articles'),
# some urls left out for brevity
url(r'^article-submit/$', ArticleSubmitView.as_view(), name='article-submit'),
]
Однако форма не отправляется из шаблона списка и не отправляется из шаблона формы. Он также не перенаправляет или не показывает никаких сообщений об ошибках.
Что я делаю неправильно?
редактировать:
Проверка, если форма является действительным или не так, как это показывает мне, что форма на самом деле не действует:
class ArticleSubmitView(CreateView):
model = Article
form_class = ArticleSubmitForm
# success url not necessary because model has get_absolute_url
# however it does not redirect to the article
template_name = 'articles/article-submit.html'
# handle post data from other template/view
# ???
def form_valid(self, form):
print('form is valid')
def form_invalid(self, form):
print('form is invalid')
print(form.errors)
Однако я получаю:
AttributeError at /article-submit/
'ArticleSubmitForm' object has no attribute 'errors'
То же самое происходит при визуализации формы как только {{form}}
Похоже, вы пытаетесь сделать несколько вещей сразу - индивидуальный отрисовщик шаблонов вместо использования '{{form}}', 'MultiModelForm' из стороннего приложения и отправки от одного URL-адреса другому. Было бы легче отлаживать, если бы вы пытались сделать один из них одновременно, а не сразу. Если вы попытаетесь напечатать 'form.errors' в методе' form_invalid', это может показать, что происходит неправильно. Если это не поможет, попробуйте как можно больше упростить свои взгляды и шаблоны и сначала попробуйте простой пример. – Alasdair
@Alasdair да, правда. Я просто попробовал распечатать form.errors и отредактировал OP, чтобы это отразить. Попытайтесь использовать только {{form}} next. Благодаря! – Flobin