如何将表单视图嵌入到Django基于函数的详细信息视图中

时间:2017-01-10 14:20:58

标签: django forms

这应该是一种常见的情况,但我无法在Django文档或互联网上的许多与Django相关的教程中找到正确的方法。所以我可能只是不知道该找什么,或者没有特别的方法。我是一个业余爱好程序员,刚开始使用Django,所以肯定缺乏很多知识,但我也在寻找最佳实践,而不仅仅是解决方法。

我有一个基于功能的详细视图,可以显示照片和评论。所以urls.py包含:

app_name = 'photos'
urlpatterns = [url(r'^(?P<photo_id>\d+?)', views.single_photo_page, name="single-photo"),]

在views.py中:

@login_required
def single_photo_page(request, photo_id: str):
    photo = get_photo_by_id(photo_id)
    if photo:
        return render(request, 'photos/single_photo.html', {'photo': photo})
    else:
        return HttpResponseNotFound('Photo %d not found' % photo_id)

single_photo.html:

<h1>{{ photo.id }}</h2>
<img src="{{ photo.image.url }}"/>
{% for comment in photo.comment_set.all|dictsort:"creation_timestamp" %}
  <div>
    <p>{{ comment.signature }}</p>
    <div>{{ comment.body|linebreaksbr|urlize }}</div>
  </div>
{% endfor %}

要接受用户评论,我想使用Django的表单功能,但无法找到如何将表单嵌入到现有视图中。所以我手工完成了它:

view.py:

@login_required
def single_photo_page(request, photo_id: str):
    photo = get_photo_by_id(photo_id)
    try:
        new_comment_body = request.POST['comment-body']
        if new_comment_body:
            comment = Comment.objects.create(
                author=request.user,
                body=new_comment_body,
                photo=photo
            )
            comment.save()
        else:
            messages.add_message(request, messages.ERROR, 'Empty comment')
    except KeyError:
        # no comment body in the request, so it's not a request from the form
        pass
    if photo:
        return render(request, 'photos/single_photo.html', {'photo': photo})
    else:
        return HttpResponseNotFound('Photo %d not found' % photo_id)

single_photo.html,在评论渲染之后:

<form action="{% url 'photos:single-photo' photo.id %}" method="post">
  {% csrf_token %}
  <label for="comment-body">Add comment</label><br />
  <textarea id="comment-body"></textarea>
  <input type="submit" value="Save" />
</form>

这种方法工作正常,但意味着我手动完成设计Django表单功能的东西。我错过了什么,或者是正确的方法吗?

0 个答案:

没有答案