如何提交表单以更新现有对象

时间:2016-07-29 10:00:22

标签: django models django-1.9

我有一个名为Book的模型,我发送给html来显示如下数据:

books = Book.objects.all()
return render(request, 'index.html', {'books':books})

然后我在前端显示了我想要的所有信息(这里不需要显示)。

除了在前端显示书籍的信息之外,我还想介绍一个有两个按钮的小表单,让我们说“提交”和“拒绝”,它将更新Book对象的属性,具体取决于点击按钮。

我正在努力寻找实现这一目标的好方法。我的想法是将整个对象发布到视图以便稍后处理,但我不确定从客户端到服务器提交整个对象是否是一个好习惯,因为这可能会以某种方式受到影响。

3 个答案:

答案 0 :(得分:2)

这可能会对您有所帮助:

如果您想使用与Book对象相关的其他值更新数据库,那么您可以通过执行以下操作来实现:

if request.POST:
        book_form = BookForm(request.POST)

    if book_form.is_valid():

        book = Book.objects.get(pk=book_id)
            book_form = BookForm(request.POST, instance = book)
            book_form.save() 

它将通过基于book_id进行过滤来更新数据库中的现有bookObject。

答案 1 :(得分:1)

如果它只是您要更新的属性,则无需发送任何表单数据。你可以做这样的事情(我使用uuid作为一个例子,你可以使用id或你想要的任何唯一字段):

# url for your update view. For example: decline
url(r'^decline/book/(?P<book_uuid>[\w\-]+)$',
    YourView.as_view(),
    name="book-decline"),

# views.py
class YourView(View):
    def get(self, request, *args, **kwargs):
        book_uuid = kwargs.get('book_uuid', None)
        book = get_object_or_404(Book, uuid= book_uuid)
        # UPDATE YOUR BOOK HERE

# in your templates for each book's decline button link
<a href={% "book-decline" book.uuid %} ....>

答案 2 :(得分:0)

Tiny Instance提供了一个通用解决方案。如果你想通过获取用户填写的表单来更新模型对象的更具体的解决方案,那么Django有内置的东西为你做这件事。您正在寻找 FormView

请参阅此处的官方文档 - &gt; https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#formview