【问题标题】:Post method is not updating database DjangoPost 方法没有更新数据库 Django
【发布时间】:2020-12-29 21:42:16
【问题描述】:

Post 方法没有更新数据库 大家好!我真的是 Django 和 python 的新手,我真的需要你的帮助,拜托。 我需要修改 Anomalie 类实例的一个属性(状态)。我正在使用表格来做到这一点。问题是当我“提交”更新它时,我的数据库中没有任何内容。我正在按照分步教程进行操作,但在我的情况下不起作用。

这是我的模型类:

class Anomalie (models.Model):
    ANOMALIE = (
        ("Etiquette absente", "Etiquette absente"),
        ("Etiquette decalee", "Etiquette decalee"),
        ("Etiquette inconnue", "Etiquette inconnue"),
    )

    ANOMALIE_STATE = (
        ("traité", "traité"),
        ("mise à jour", "mise à jour"),
        ("signalé", "signalé"),


    )
    type = models.CharField(
        max_length=200, choices=ANOMALIE, null=False)
    date_report = models.DateTimeField(null=False, blank=False)

  
    localization = models.TextField(max_length=30, null=False, blank=False)
    state = models.CharField(
        max_length=200, choices=ANOMALIE_STATE, null=False)
  
    aisle = models.ForeignKey(Aisle, null=True, on_delete=models.SET_NULL)
    product = models.ForeignKey(
        Product, null=True, on_delete=models.SET_NULL)
   

    def datepublished(self):
        return self.date_report.strftime('%B %d %Y')

    def __str__(self):
        return self.type

这是view.py

def treter_anomalie(request, pk):
    anomalie_pk = Anomalie.objects.get(id=pk)

    if request.method == "POST":
        anomalie_pk.state = 'traité'
        return redirect('/')

    context = {'anomalie_pk': anomalie_pk}

    return render(request, 'anomalie/treter_anomalie.html', context)

这是 treter_anomalie.html

{% extends 'base.html'%}
{% load static %}
{%block content%}
<div id="layoutSidenav">
    <div id="layoutSidenav_content">
        <main>
            <div class="container-fluid">

                <P>treter anomalie {{ anomalie_pk.id }}</P>

                <form action="{% url 'treter_anomalie' anomalie_pk.id %}" method="POST">{% csrf_token %}

                    <a href="{% url 'fix_anomalie_stock' anomalie_pk.id anomalie_pk.type %}"> cancel</a>
                    <input type="submit" name="confirm">
                </form>
            </div>

        </main>

    </div>

</div>

{%endblock content%}

这是 urls.py

from anomalie.views import(
    consult_anomalie,
    fix_anomalie_stock,
    update_location_view,
    treter_anomalie,

)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home_screen_view, name="home"),
    path('consult/<str:pk>/', consult_anomalie, name="consult_anomalie"),
    path('fix_anomalie_stock/<str:pk>/<str:type_anomalie>',
         fix_anomalie_stock, name="fix_anomalie_stock"),
   
]

所以当我运行代码时,它会返回主页(我有异常列表),当我查阅特定异常时,我看不到任何变化。 另外,你尝试了anomalie_pk.delete,因为可能选择不同,但它没有被删除。

我没有在 cmd 中看到错误。我真的不知道发生了什么,所以非常感谢您的帮助

【问题讨论】:

  • 设置状态后不要调用anomalie_pk.save()。第二件事是,POST 应该用于创建新对象,而不是更新现有对象。对于更新,您应该使用PATCH
  • @MikołajRutecki 这是从网页提交表单,而不是 API 请求,所以 POST 很好。据我所知,您需要使用 JavaScript 从网页提交 PATCH 请求。

标签: python django forms post


【解决方案1】:

为了保存对象,您需要调用save 方法。

def treter_anomalie(request, pk):
anomalie_pk = Anomalie.objects.get(id=pk)

if request.method == "POST":
    anomalie_pk.state = 'traité'
    anomalie_pk.save() # this will save the object
    return redirect('/')

context = {'anomalie_pk': anomalie_pk}

return render(request, 'anomalie/treter_anomalie.html', context)

POST 不用于更新对象。您可以创建一个单独的视图来更新对象。

编辑

创建一个单独的视图。

在关闭检查时,我看到 treter_anomalie 仅用于更新对象,即它不用于新对象。如果是这种情况,那么您不需要创建单独的方法(视图)。您只需要将表单上的method 属性更改为PUT,并将if 语句更改为request.method == "PUT"

POST 用于创建

正如我提到的,POST 用于创建操作而不是更新操作。但在实践中,我看到很多次在不同的项目中使用POST 来创建和更新。

【讨论】:

  • 非常感谢!!! :D 这正是我所缺少的!关于创建一个单独的视图来更新对象,你到底是什么意思?你有例子吗,我很想学习。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2020-10-01
  • 2022-01-11
  • 2020-12-31
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多