python - 这是从数据库中打开对象以相同形式进行编辑,然后使用 django 保存同一对象的更新值的正确方法吗?
问题描述
这是我的代码:
要创建新的问题对象,请使用表单
def raise_issue_view(request, *args, **kwargs):
form = RaiseIssueForm(request.POST or None)
if form.is_valid():
form.save()
obj = RaiseIssueModel.objects.latest('id')
return redirect("/raise_issue/" + str(obj.id))
context = {
"form" : form
}
return render(request,"raise_issue.html", context)
要编辑之前创建的问题,请通过链接 127...8000/edit_issue/<issue_id>
def edit_issue_view(request, id):
obj = RaiseIssueModel.objects.get(id=id)
form = RaiseIssueForm(instance=obj)
new_form = RaiseIssueForm(request.POST, instance=obj)
if new_form.is_valid():
new_form.save()
return redirect("/raise_issue/" + str(obj.id))
context = {
"form" : form
}
return render(request,"raise_issue.html", context)
在这里,在编辑问题视图中,首先我将数据库数据加载到“表单”中,然后创建一个新表单 (new_form) 来保存更新的数据。这可以吗,还是有更好的方法来做到这一点?谢谢,
解决方案
您可以使用GET
和POST
请求来执行不同的功能。GET 用于从 DB 和 POST 获取对象以进行更改并将其保存到 DB。例如:
from django.shortcuts import get_object_or_404
def edit_issue_view(request, id):
obj = get_object_or_404(RaiseIssueModel, pk=id)
new_form = RaiseIssueForm(request.POST or None, instance=obj)
if request.method == 'POST':
if new_form.is_valid():
new_form.save()
return redirect("/raise_issue/" + str(obj.id))
context = {
"form" : new_form
}
return render(request,"raise_issue.html", context)
raise_issue_view
还添加了有关重定向到编辑视图的方法的微小更改。如您所见,form.save()
返回您刚刚创建/更新的对象。您可以将其用于重定向:
if form.is_valid():
obj = form.save()
return redirect("/raise_issue/" + str(obj.id))
最后,对于重定向,最好使用命名的 url。例如,如果您的网址如下所示:
path('raise_issue/<int:pk>/', name='raise_issue')
然后您可以使用以下代码进行重定向:
return redirect('raise_issue', pk=obj.pk)
有关详细信息,请参阅文档。
推荐阅读
- php - PHP电子表格生成
- javascript - JavaScript 显示的时间在两台设备上不同(Apple-Windows)
- state - Ansible mount with state:mounted not working for sshfs
- regex - 正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词
- java - 如何使 hibernate cfgxml 文件能够定位?
- thymeleaf - 创建一个百里香片段列表并将其作为参数传递给另一个片段
- python - 使用 Scrapy 从论坛获取搜索结果
- c++ - 耦合策略模式中的两个行为之间需要和共享大量计算。应该在哪里做和举行
- javascript - 尽管提供了唯一键,但 React 为单选按钮(在地图中)提供了唯一键警告
- oauth-2.0 - 安全原生应用 OAuth2 代码流 + PKCE