Hoe schrijf ik een formulier in Django

Ik schrijf een forums-app voor mijn afstudeerproject in de klas en ik probeer een formulier te schrijven voor het maken van een nieuwe thread. Eigenlijk alles wat ik nodig heb om te doen is

gebruikersnaam: tekstvak hier

Naam van de draad: tekstvak hier

Bericht: tekstvak hier

Ik wil dit doen in form.py in plaats van er een sjabloon voor te maken.

url(r"^(.+)/new_thread/$", new_thread, name="thread_new_thread"),

Dat is mijn url-thread

def list_threads(request, forum_slug):
    """Listing of threads in a forum."""
    threads = Thread.objects.filter(forum__slug=forum_slug).order_by("-created")
    threads = mk_paginator(request, threads, 20)
    template_data = {'threads': threads, 'forum_slug': forum_slug} 
    return render_to_response("forum/list_threads.html", template_data, context_instance=RequestContext(request))

Dat is mijn lijstweergave. Ik heb een knop die moet linken naar de form.py-versie van mijn nieuwe discussiepost

class Thread(models.Model):
    title = models.CharField(max_length=60)
    slug = models.SlugField(max_length=60)
    created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, blank=True, null=True)
    forum = models.ForeignKey(Forum)

    class Meta:
        unique_together = ('slug', 'forum', )

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Thread, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('forum_list_posts', args=[self.forum.slug, self.slug])

    def __unicode__(self):
        return unicode(self.creator) + " - " + self.title

    def num_posts(self):
        return self.post_set.count()

    def num_replies(self):
        return self.post_set.count() - 1

    def last_post(self):
        if self.post_set.count():
            return self.post_set.order_by("created")[0]

Dit is mijn draadmodel

Suggesties?

1

1 antwoord

Lees de documentatie:

https://docs.djangoproject.com/en/dev/topics/forms/ modelforms/

Ik denk dat de draad een model heeft.

class ThreadForm(ModelForm):

    def __init__(self, forum, user, *args, **kwargs):
        super(ThreadForm, self).__init__(*args, **kwargs)
        self.forum = forum
        self.user = user

    def save(self):
        thread = super(ThreadForm, self).save(commit=False)
        thread.forum = self.forum
        thread.creator = self.user
        thread.save()
        return thread

    class Meta:
        model = Thread
        exclude = ('slug', 'created', 'creator', 'forum') 

In jouw visie:

def thread_add(self, forum_id):
    data = None
    if request.method == 'POST':
        data = request.POST
    forum = Forum.objects.get(id=form_id)
    form = ThreadForm(forum=forum, user=request.user, data=data)
    if form.is_valid():
        form.save()
        .............
    return render_to_response .....

In uw model heeft u een veld achtergelaten naar 'Bericht: tekstvak hier'

1
toegevoegd
Ik heb de vraag bewerkt en mijn model toegevoegd sorry.
toegevoegd de auteur Robert, de bron
Dat heeft je bedankt.
toegevoegd de auteur Robert, de bron
Goed antwoord, maar je moet het huiswerk van mensen niet voor hen doen.
toegevoegd de auteur Daniel Roseman, de bron
Ok mijn antwoord bewerken
toegevoegd de auteur Goin, de bron
Bewerkt, maar lees de documentatie
toegevoegd de auteur Goin, de bron
Ik weet het :-), maar ik kan bijna alles doen omdat iemand de django-formulieren gebruikt.
toegevoegd de auteur Goin, de bron