在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?
Posted
技术标签:
【中文标题】在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?【英文标题】:In Django, how to redirect to an UpdateView upon submitting the CreateView? 【发布时间】:2019-09-07 21:55:09 【问题描述】:我创建了一个 FormView 和模板 html,我将使用它们来创建和更新模型中的记录。
但是,我无法弄清楚如何将 CreateView 设置为重定向到正在创建的新主键。我目前已将其设置为返回到基本页面,但我似乎找不到任何有关从何处开始获取新主键或现有主键以重定向到 UpdateView 的信息。
models.py
class NewEmployee(models.Model):
name = models.CharField(max_length=50)
position = models.CharField(max_length=50)
start_date = models.DateField()
date_entered = models.DateTimeField('date entered', auto_now_add=True)
forms.py
class NewEmpForm(ModelForm):
class Meta:
model = NewEmployee
fields = ['name', 'position', 'start_date']
views.py
class EditView(UpdateView):
model = NewEmployee
form_class = NewEmpForm
class Add_Emp(CreateView):
model = NewEmployee
form_class = NewEmpForm
urls.py
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('add/', views.Add_Emp.as_view(success_url='../'), name='newemp-add'),
path('<int:pk>/', views.EditView.as_view(success_url="../"), name='newemp-rev'),
]
newemployee_form.html
<DOCTYPE html>
<html>
<head>
<title>Employee</title>
</head>
<body>
<form method="post" >
% csrf_token %
form.as_p
<button type="submit" class="btn btn-default">Submit</button>
</form>
</body>
</html>
【问题讨论】:
【参考方案1】:您不能使用success_url
来执行此操作,因为您需要访问该对象才能获取其 pk。
最简单的方法是为您的模型覆盖get_absolute_url
。
class NewEmployee(models.Model):
...
def get_absolute_url(self):
return reverse('newemp-rev', [self.pk])
然后从您的 URL 模式中删除 success_url
以用于创建和更新视图。默认情况下,它们都将使用对象的 get_absolute_url
方法来获取要重定向到的 URL。
如果您不想覆盖get_absolute_url
,则为两个视图都覆盖get_success_url
,例如:
class Add_Emp(CreateView):
model = NewEmployee
form_class = NewEmpForm
def get_success_url(self):
return reverse('newemp-rev', [self.object.pk])
【讨论】:
【参考方案2】:在您的 CreateView
中,您通常会覆盖 form_valid
方法,该方法在表单验证后运行:
from django.shortcuts import redirect
class Add_Emp(CreateView):
model = NewEmployee
form_class = NewEmpForm
def form_valid(self, form):
employee = form.save() # save form
return redirect('newemp-rev', pk=employee.pk)
【讨论】:
【参考方案3】:您可以通过覆盖get_success_url
来获取保存在CreateView
中的对象
class MyCreateView(CreateView):
...
def get_success_url(self):
return reverse('newemp-rev', [self.object.pk])
【讨论】:
【参考方案4】:这篇文章可能会有所帮助:
https://realpython.com/django-redirects/#redirects-in-django
您可以在 is_valid() 方法中编写重定向代码。
【讨论】:
【参考方案5】:从 Django v3.0 开始,您需要像这样传递参数:
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
来自文档:“如果 URL 接受参数,您可以在 args 中传递它们。例如:”
分享,因为它绊倒了我:)
【讨论】:
以上是关于在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?
在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?