0

У меня есть 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'), 
] 

Однако форма не отправляется из шаблона списка и не отправляется из шаблона формы. Он также не перенаправляет или не показывает никаких сообщений об ошибках.

Что я делаю неправильно?

Full code is available here.

редактировать:

Проверка, если форма является действительным или не так, как это показывает мне, что форма на самом деле не действует:

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}}

+0

Похоже, вы пытаетесь сделать несколько вещей сразу - индивидуальный отрисовщик шаблонов вместо использования '{{form}}', 'MultiModelForm' из стороннего приложения и отправки от одного URL-адреса другому. Было бы легче отлаживать, если бы вы пытались сделать один из них одновременно, а не сразу. Если вы попытаетесь напечатать 'form.errors' в методе' form_invalid', это может показать, что происходит неправильно. Если это не поможет, попробуйте как можно больше упростить свои взгляды и шаблоны и сначала попробуйте простой пример. – Alasdair

+0

@Alasdair да, правда. Я просто попробовал распечатать form.errors и отредактировал OP, чтобы это отразить. Попытайтесь использовать только {{form}} next. Благодаря! – Flobin

ответ

0

Как оказалось, мне не нужны django-betterforms. Регулярная модельная модель работает отлично. Были и другие ошибки.

Это код.

models.py

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', kwargs={'pk': self.id}) 

views.py

class ArticleSubmitView(CreateView): 
    model = Article 
    form_class = ArticleForm 
    template_name = 'articles/article-submit.html' 

    def form_valid(self, form): 
     print('form is valid') 
     print(form.data) 
     obj = form.save(commit=False) 
     obj.author = self.request.user 
     obj.save() 
     return HttpResponseRedirect(reverse('article', kwargs={'pk': obj.id})) 

URL-адреса и шаблоны остаются (в основном), как указано выше.

Смежные вопросы