【问题标题】:How do I write a form in django如何在 django 中编写表单
【发布时间】:2011-12-07 00:44:15
【问题描述】:

我正在为我在课堂上的期末项目编写一个论坛应用程序,我正在尝试编写一个用于创建新线程的表单,基本上我需要做的就是

用户名:此处为文本框

线程名称:此处为文本框

发布:此处的文本框

我想在 forms.py 中执行此操作,而不是为其制作模板。

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

这是我的 url 线程

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

这是我的 list_threads 视图,我有一个按钮应该链接到我的新线程帖子的 forms.py 版本

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]

这是我的线程模型

有什么建议吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    阅读文档:

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

    我猜线程有一个模型。

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

    在你看来:

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

    在您的模型中留下一个字段“发布:此处的文本框”

    【讨论】:

    • 很好的答案,但你不应该为别人做作业。
    • 我知道 :-),但我几乎可以做任何事情,因为有人会使用 django 表单。
    猜你喜欢
    • 2011-05-23
    • 2011-11-10
    • 2012-08-10
    • 1970-01-01
    • 2021-06-29
    • 2018-05-10
    • 2016-11-10
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多