【问题标题】:success_url in UpdateView, based on passed valueUpdateView 中的success_url,基于传递的值
【发布时间】:2012-06-17 04:26:27
【问题描述】:

如何根据参数设置success_url
我真的很想回到我来的地方,而不是某个静止的地方。在伪代码中:

url(r'^entry/(?P<pk>\d+)/edit/(?P<category>\d+)',
    UpdateView.as_view(model=Entry, 
                       template_name='generic_form_popup.html',
                       success_url='/category/%(category)')),

这意味着:编辑条目pk,然后返回“类别”。这里一个条目可以是多个类别的一部分。

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    为什么不在表单(模板)中添加“下一个”参数并在视图中捕获它。以这种方式实现重定向是常见的做法。

    【讨论】:

      【解决方案2】:

      创建一个继承自UpdateView的类MyUpdateView并覆盖get_success_url方法:

      class MyUpdateView(UpdateView):
          def get_success_url(self):
              pass #return the appropriate success url
      

      我也喜欢在继承的类视图中传递模板名和模型等参数,但不在 urls.py 中的 .as_view() 中传递

      【讨论】:

      • 这样get_success_url 将指向一个不存在的像/items/1/None 这样的url。
      【解决方案3】:

      有同样的问题。正如 Dima 所说,能够从 self.kwargs 中获取参数:

      def get_success_url(self):
              if 'slug' in self.kwargs:
                  slug = self.kwargs['slug']
              else:
                  slug = 'demo'
              return reverse('app_upload', kwargs={'pk': self._id, 'slug': slug})
      

      【讨论】:

      • 这对我很有用 - 虽然我需要确保 slug 以“/”开头,否则我会得到像“/formpage/successurl/successurl/successurl/”这样的网址,它会不断添加到结束,而不是开始。
      • @JayCrossler - 我认为这是由于相对地址与绝对地址。前导斜杠表示 url 从那里开始。如果没有斜杠,它会附加到前一个 url,就像使用 ls 命令的 unix 路径一样。
      • 可以使用 .get() 进一步简化: slug = self.kwargs.get('slug', 'demo')
      • 我在 Django 2.2.5 - 'pk': self._id 需要更改为 'pk': self.object.id
      【解决方案4】:

      在您的模型上定义 get_absolute_url(self)。示例

      class Poll(models.Model):
          question = models.CharField(max_length=100)
          slug = models.SlugField(max_length=50)
          # etc ...
      
          def get_absolute_url(self):
              return reverse('poll', args=[self.slug])
      

      如果您的PollUpdateView(UpdateView) 将该模型的实例加载为object,则默认情况下会查找get_absolute_url() 方法来确定在POST 之后重定向到的位置。那么

      url(r'^polls/(?P<slug>\w+)/, UpdateView.as_view(
          model=Poll, template_name='generic_form_popup.html'),
      

      应该这样做。

      【讨论】:

      • 如果是 CreateView,由于实例还不存在,只需创建一个 form_valid 函数,如:def form_valid(self, form): obj = form.save(commit=False) obj。 profile_id = self.request.user.id obj.save() self.success_url = self.model.get_absolute_url(obj)
      【解决方案5】:

      我找到了一种有用且非常简单的方法。看看吧。

      class EmployerUpdateView(UpdateView):
              model = Employer
              #other stuff.... to be specified
      
              def get_success_url(self):
                 pk = self.kwargs["pk"]
                 return reverse("view-employer", kwargs={"pk": pk})
      
          
      

      【讨论】:

      • 你能解释一下view-employer在这种情况下是什么吗?
      • view-empployerurlpatterns 列表中 EmployerDetailView 的名称。像这样path("view-employer/&lt;pk&gt;/", EmployerDetailView.as_view(), name="view-employer")
      • 谢谢。不幸的是,它仍然产生错误:“找不到'view-employer'的反向。'view-employer'不是有效的视图函数或模式名称。我刚刚针对我的特定问题提出了一个问题:stackoverflow.com/questions/66262282/…
      • 好的,我去看看。
      猜你喜欢
      • 2017-06-23
      • 1970-01-01
      • 2020-04-15
      • 2011-11-15
      • 2018-12-09
      • 2023-03-31
      • 1970-01-01
      • 2021-10-28
      • 2013-12-05
      相关资源
      最近更新 更多