latest news

2008-11-09 19:33:42

Umstellung und Migration

2 Comments

unanswered questions

2008-10-30 13:34:21

Syndication Feed-Problem

0 Replies

2008-11-17 16:49:19

dynamische urlpatterns...

2 Replies

2008-12-22 02:46:20

Fragen zu pagination ~~

1 Replies

Profile for miracle2k

Name miracle2k
Email Address hidden
AvatarUsers avatar
Posts6
  • Re: user.is_authenticated in templates
    Board » Django das Framework » Anleitungen / Howto's
    Die Methode macht in der Shell keinen Sinn. Ein User-Objekt gibt hier immer True zurück. Wenn ein User allerdings während einem Request nicht eingeloggt ist, dann enthält request.user keinen "echten" User, sondern eine AnonymousUser-Instanz, die stattdessen immer False zurückgibt.
  • Re: Django Webseiten aus DE
    Board » Off-Topic » Off-Topic
  • Re: Comments bei einem Blog
    Board » Django das Framework » Probleme & Fragen
    return HttpResponseRedirect('/blog/%s/' % entry_slug)
    Das kann man übrigens besser schreiben mit reverse()

    http://www.djangoproject.com/documentation/url_dispatch/#reverse

    reverse(detail, kwargs={'slug': entry_slug})
    


    Die URL wird dann automatisch aus den urlpatterns erstellt - sprich keine Duplizierung, wenn man die URL ändert muss man nicht alle Redirects anpassen.

    Das Kommentar sollte schon automatisch dem richtigen post zugeordnet werden, und nicht beim
    schreiben auswählbar sein.


    Es gibt verschiedene Möglichkeiten aus der Form zu entfernen. Am einfachsten ist wohl editable=False beim Feld im Model zu setzen, dann wird es gar nicht erzeigt. Alternativ kann man den callback von form_for_* verwenden, oder das Feld einfach löschen, nachdem die Form erzeugt wurde (aber wohl nicht so optimal):

    del form.fields['post']  # als instanz
    del CommentFormClass.base_fields['post']  # als klasse
    


    und dann wie ich schon gepostet hatte, die Form nicht sofort abspeichern.

        if form.is_valid():
            comment = form.save()
            comment.post = entry
            comment.save()
            ...
    
  • Re: Etwas zum starten....
    Board » Django das Framework » Anleitungen / Howto's
    Mich würden speziell deutschsprachige Blogs interessieren. Abgesehen von Tim Adler, gibt es sonst noch jemanden?
  • Re: Comments bei einem Blog
    Board » Django das Framework » Probleme & Fragen
    Nur weiß ich jetzt halt nicht wie genau die def postcomment() aussehen muss.
    Du hast irgendwo einen View, der das Formular als HTML ausgibt. Das Formular ruft beim Abschicken dann die Seite auf, die angegeben ist, und übergibt die Daten per POST.

    <form action="ziel-url">


    Hinter dieser URL muss dann ein Django-View stehen der die POST Daten ausliest und den Kommentar abspeichert. Das kann auch derselbe sein, der das Formular angezeigt hat. Je nach dem wie man es also implementiert brauchst du entweder zwei Views (einem zum Anzeigen, einen als Abschicken-Ziel), oder nur einen. In letzterem Fall kannst du mit

    if request.method == &#039;POST&#039;:
        # abgeschickt
    else:
        # formular anzeigen
    


    unterscheiden. Am Ende musst du die Formulardaten in eine Instanz deines Comment-Models übertragen. Ich glaube die besten Beispiele findet man in Blogs, zum Beispiel:

    http://weblog.bignerdranch.com/?p=31

    Angenommen, man verwendet nur einen view zum Kommentar-anzeigen und Abschicken (bei einem Blog könnte das z.b. der artikel_detail view sein, der den Blogartikel inklusive Kommentarfeld anzeigt.

    def artikel_detail(request, artikel_id):
            # informationen zum blog artikel holen
            artikel = BlogEntry.objects.get(pk=artikel_id)
            ..... 
    
            # kommentarform vorbereiten
            CommentFormClass = forms.form_for_model(CommentModel)  
    
            # im post mode das abgeschickte auswerten
            if request.POST:
                    form = CommentFormClass(request.POST)       
                    # auf gültigkeit prüfen. wenn die form ungültig ist (z.b. feld fehlt), dann wird als nächte
                    # anweisung render_to_response() mit der geprüften, ungültigen form (die dann, mit dem 
                    # richtigen template, automatisch die fehler markieren würde - weil sie weiß dass sie
                    # geprüft wurde und was schief ging).
                    if form.is_valid(): 
                            # comment enthält jetzt die Instanz des CommentModel                        
                            comment = form.save()                  
                            # Alternative zum vorherigen, um zum beispiel den autor automatisch zu setzen
                            comment = form.save(commit=False)                                                                     
                            comment.author = request.user
                            comment.save()
                            # zum aktuellen artikel "zurück-weiterleiten". das sorgt dafür dass wir a) wieder mit einer 
                            # leeren form starten, und b) der benutzer nicht mit f5 den kommentar aus versehen
                            # dupliziert (weil die POST daten dann weg sind). die url würde in dem fall eigentlich die gleiche
                            # bleiben.
                            return HttpResponseRedirect(&#039;blog_artikel_url&#039;)
    
            # ohne POST einfach eine leere form anzeigen, die der user verwenden kann
            else:
                    form = CommentFormClass()                   
    
            # ausgeben
            return render_to_response(&#039;Add_Item.html&#039;, {&#039;form&#039;: form, &#039;artikel&#039;: artikel, ...})
    
    


    Übrigens hat Django ja auch eine Comment-App, allerdings habe ich die nie verwendet.
  • Re: Comments bei einem Blog
    Board » Django das Framework » Probleme & Fragen
    Also bei mir hab ich das folgendermaßen gemacht, in der views.py:
    def foo(request)
    	if request.method == &#039;POST&#039;:
    		form = CommentForm(request.POST)
    		if request.POST[&#039;captcha&#039;] == request.session.get(&#039;captcha&#039;, &#039;&#039;):
    			form.captcha_error = False
    			if form.is_valid():
    				form_data = form.data
    				comment = Comment()
    				comment.subject = form_data[&#039;subject&#039;]
    				comment.name = form_data[&#039;name&#039;]
    				comment.homepage = form_data[&#039;homepage&#039;]
    				comment.email = form_data[&#039;email&#039;]
    				comment.message = form_data[&#039;message&#039;]
    				comment.blogentry_id = blogentry.id
    				comment.remote_address = "127.0.0.1"
    				comment.save()
    				form = CommentForm()
    
    Das solltest du eigentlich auch kürzer schreiben können, wenn du form_for_model() oder form_for_instance() verwendest, anstatt CommentForm selber zu definieren:

    def foo(request)
            if in_edit_mode: CommentForm = form_for_instance(existierender_comment)
            else: CommentForm = form_for_model(Comment)
            ....
    	if request.method == &#039;POST&#039;:
    		form = CommentForm(request.POST)
    		if request.POST[&#039;captcha&#039;] == request.session.get(&#039;captcha&#039;, &#039;&#039;):
    			form.captcha_error = False
    			if form.is_valid():
    				comment = form.save()