Django应用程序中的可重用表单

时间:2014-04-02 14:28:28

标签: django django-forms django-templates

我想创建一个应用程序,它提供格式正确的表单,可以导入到其他应用程序中。使用ModelForm之外的任何操作都可以获得部分成功,因为它只渲染表单字段而没有任何额外需要的元素,如按钮。但是,这也应该封装在应用程序中。

长:

为了更好地理解,我们假设我们有一个名为blog的应用程序和一个名为comments的应用程序。由于评论也可能在其他地方和应用中使用,因此它们已被分开。 comments应提供一个表单,然后将其添加到blog

的视图或模板中

所以这里有一些伪代码以便更好地理解。

评论/ models.py:

class Comment(models.Model):
    comment = models.TextField()
    author = models.CharField(max_length=64)

评论/ forms.py:

class CommentForm(forms.ModelForm)
    class Meta:
        model = Comment

评论/模板/评论/ comment_form.html:

<form method="post" action="#">
    {{ formfields }}
    <button type="submit">Submit</button>
</form>

显然,由于ModelForm并且模板没有放在一起,因此缺少一个步骤。我现在的目标是将这种婚姻直接导入blog

博客/ views.py

def render_article(request):
    context = {
        ...
        comment_form: <SOMETHING THAT CREATES A NICE TEMPLATE BASED HTML FORM>
    }

    return render(request, 'blog/article.html', context)

本质上,我正在寻找一个单一的功能对象,我可以在任何类型的应用程序中使用它来提供完整的表单。这样,它在所有应用程序中看起来都一样。

怎么做?

1 个答案:

答案 0 :(得分:0)

您可以在表单中覆盖django.forms.Form.__unicode__

from django.utils.safestring import mark_safe

class MyForm(forms.Form):
   ...
   def __unicode__(self):
       html = super(MyForm, self).__unicode__
       html = html + '<button type="submit">Submit</button>'
       // or whatever — render a wrapper template, anything
       return mark_safe(html)