【问题标题】:In Django, how to redirect to an UpdateView upon submitting the CreateView?在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?
【发布时间】: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>

【问题讨论】:

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


    【解决方案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 中传递它们。例如:”

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-20
              • 2015-06-25
              • 2016-02-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多