0

Ich habe eine ModelForm, die ich an mehreren Stellen anzeigen möchte. Zum Beispiel in einem ListView unterhalb der Artikelliste. Ich kann dies tun, indem Sie es in der ListView in get_context_data() setzen. Ich möchte das Formular auch in einer eigenen Vorlage anzeigen.Wie schreibe ich Django klassenbasierte Ansicht für Formularanzeige und Vorlage von anderen Vorlage?

Ich habe eine Ansicht für das Formular erstellt, bin mir aber nicht sicher, wie Sie es tatsächlich schreiben.

Ich habe ein get_absolute_url() in meinem Modell definiert:

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) 

Der Blick für das Formular selbst ist:

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 
    # ??? 

Die Vorlage das Formular enthält (gleiche Sache für die ListView-Vorlage).

article-submit.html

{% extends 'articles/base.html' %} 
{% block article-submit %} 
    {% include 'articles/article-form.html' %} 
{% endblock article-submit %} 

Das Formular abschickt auf die URL, die die Create ruft:

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'), 
] 

Das Formular wird jedoch nicht von der Listenvorlage gesendet und auch nicht von der Formularvorlage selbst gesendet. Es wird auch nicht umgeleitet oder zeigt Fehlermeldungen an.

Was mache ich falsch?

Full code is available here.

edit:

Überprüfen Sie, ob das Formular gültig ist oder nicht, wie dies zeigt mir, dass die Form eigentlich nicht gültig ist:

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) 

Allerdings erhalte ich:
AttributeError at /article-submit/
'ArticleSubmitForm' object has no attribute 'errors'

Das gleiche passiert beim Rendern des Formulars als nur {{form}}

+0

Es sieht so aus, als würden Sie mehrere Dinge auf einmal tun - benutzerdefiniertes Template-Rendering, statt nur '{{form}}', 'MultiModelForm' aus einer Drittanbieter-App zu verwenden und von einer URL zur anderen zu senden. Es wäre einfacher zu debuggen, wenn Sie versuchen würden, eines von diesen auf einmal statt alle auf einmal zu tun. Wenn Sie versuchen, 'form.errors' in der Methode' form_invalid' zu drucken, wird möglicherweise angezeigt, was falsch läuft. Wenn das nicht hilft, versuchen Sie, Ihre Ansichten und Vorlagen so weit wie möglich zu vereinfachen und ein einfaches Beispiel zuerst zu erstellen. – Alasdair

+0

@Alasdair ja wahr. Ich habe gerade versucht, form.errors zu drucken, und habe das OP bearbeitet, um dies zu reflektieren. Ich werde versuchen, als nächstes {{form}} zu verwenden. Vielen Dank! – Flobin

Antwort

0

Wie sich herausstellt, brauche ich keine Django-besseren Formen. Eine reguläre Modellform funktioniert gut. Es gab noch einige andere Fehler.

Dies ist der Code.

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

Die Urls und Vorlagen bleiben (weitgehend) wie oben.

Verwandte Themen