在Django中,如何在提交CreateView时重定向到UpdateView?

时间:2019-04-17 15:27:47

标签: django django-forms django-urls django-class-based-views

我已经创建了一个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>

5 个答案:

答案 0 :(得分:0)

您不能使用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])

答案 1 :(得分:0)

在您的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)

答案 2 :(得分:0)

您可以通过覆盖CreateView

来保存保存在get_success_url中的对象
class MyCreateView(CreateView):
    ...
    def get_success_url(self):
        return reverse('newemp-rev', [self.object.pk])

答案 3 :(得分:0)

本文可能会有所帮助:

https://realpython.com/django-redirects/#redirects-in-django

您可以在is_valid()方法中编写重定向代码。

答案 4 :(得分:0)

从 Django v3.0 开始,您需要像这样传入参数:

def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

来自文档:“如果 URL 接受参数,您可以在 args 中传递它们。例如:”

分享,因为它绊倒了我:)