Sucess_url 基于来自 urls.py 的 GenericView 中的 pk

Sucess_url based on pk in GenericView from urls.py

在我的 url.py 中,我有这样的网址:

url(r'^messstellen/monatlicher_verbrauch/(?P<pk>[0-9]+)/update/$',
    generic.UpdateView.as_view(
        model=MonatlicherVerbrauch,
        form_class=MonatlicherVerbrauchForm,
        success_url=reverse('messstellen:messstellen_index'),
        template_name='messstellen/monatlich_form.html',
    ),

现在我想让 success_url 像这样:

success_url = redirect('messstellen:messtelle_detail', pk=pk)

其中 pk 应该与正则表达式模式中的相同 (?P<pk>[0-9]+)

有没有办法在 url.py 视图中做到这一点?

如果您不定义 success_url,那么 Django 将使用您的模型的 get_absolute_url 方法,您可以将其定义为:

class MonatlicherVerbrauch(models.Model):
    ...
    def get_absolute_url(self):
        return reverse('messstellen:messtelle_detail', args=[self.pk])

如果您的 get_absolute_url 指向不同的 url,那么我认为不可能在 url 中动态设置 success_url。您将必须覆盖视图,并定义 get_success_url.

class MonatlicherVerbrauchUpdateView(UpdateView):
    def get_success_url(self):
        return reverse('messstellen:messtelle_detail', args=[self.object.pk])

    # define these attributes in the view as well, to keep urls simple
    model=MonatlicherVerbrauch,
    form_class=MonatlicherVerbrauchForm,
    template_name='messstellen/monatlich_form.html',

然后在您的 url 中使用 MonatlicherVerbrauchUpdateView 而不是 UpdateView

url(r'^messstellen/monatlicher_verbrauch/(?P<pk>[0-9]+)/update/$',
    MonatlicherVerbrauchUpdateView.as_view()),

对通用视图进行子类化的优点是它将视图的逻辑与 url 分开。