【问题标题】:How to submit a form to update an existing object如何提交表单以更新现有对象
【发布时间】:2016-07-29 10:00:21
【问题描述】:

我有一个名为 Book 的模型,我将它发送到 html 以显示来自如下的数据:

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

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

除了在前端显示书的信息之外,我还想介绍一个小表单,它有两个按钮,比如“提交”和“拒绝”,它将根据书本对象的属性更新点击按钮。

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

【问题讨论】:

  • 我喜欢推荐这种方式...当用户选中或取消选中复选框 POST data to backend for process...
  • @RajaSimon 你能提供更多细节吗?

标签: django models django-1.9


【解决方案1】:

这可能对你有帮助:

如果您想使用与 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。

【讨论】:

  • 我没有表格。
【解决方案2】:

如果只是要更新的属性,则无需发送任何表单数据。你可以这样做(我使用 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 %} ....>

【讨论】:

  • 谢谢。这个解决方案似乎没问题,但我一直在寻找不依赖 URL 的解决方案。
【解决方案3】:

Tiny Instance 提供了一个通用的解决方案。如果您想要一个更具体的解决方案,通过从用户那里获取一个表单来更新模型的对象,那么 Django 有一些内置的东西可以为您做到这一点。 FormView 正是您要找的。​​p>

这里查看官方文档 -> https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#formview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2017-08-14
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多