Django表单视图:在success_url中传递pk

6
假设我拥有以下的FormView,并且我想在表单提交后将item.pk传递给其他视图。我猜我需要编辑get_success_url(),但是我甚至无法从form_valid()获取item.pkmodels.py
from django.db import models

class Book(models.Model):
    field1 = models.CharField(max_length=32)
    field2 = models.CharField(max_length=32)
    field3 = models.CharField(max_length=32)

    def __str__(self):
        return self.field1

forms.py

from django import forms
from .models import Book

class SomeForm(forms.ModelForm):

    field_order = ['field3', 'field2', 'field1']

    class Meta:
        model = Book
        fields = ['field1', 'field2', 'field3']

views.py

from django.shortcuts import render
from django.views.generic.edit import FormView
from .forms import SomeForm

class SomeView(FormView):
    form_class = SomeForm
    template_name = 'appname/form.html'
    success_url = reverse_lazy('somewhere')


    def form_valid(self, form):

        # save in Database
        item = form.save()

        # item.pk stores the saved pk 

        return super().form_valid(form)

    def get_success_url(self)
         # how can i get item.pk from form_valid() here and pass it to another view?

1
当您指定某个内容是否有效时,应该避免保存它。现在,您已经完全使Django合同无效化,因此可能会导致多个功能无法正常工作。 - Willem Van Onsem
顺便问一下,这是一个ModelForm吗?如果是的话,最好使用ModelFormView,因为它会更加方便。 - Willem Van Onsem
你是说 ModelFormMixin 吗?你可能有它使用的例子吗? - fuser60596
Mixin的作用是将“Form”升级为“ModelForm”,但是您可以让“SomeForm”使用“ModelForm”子类(如果它直接映射到一个单一模型)。 - Willem Van Onsem
说实话,你的评论有点让我困惑 :-( 我更新了我的代码示例,也许这可以帮助理解我所拥有的和我正在寻找的?顺便说一句,form.save()在许多其他答案中都提到过,我认为这应该没问题。 - fuser60596
3个回答

12

你可以像下面这样做

class SomeView(FormView):
    form_class = SomeForm
    template_name = 'appname/form.html'
    pk = None


    def form_valid(self, form):
        item = form.save()
        self.pk = item.pk
        return super(SomeView, self).form_valid(form)

    def get_success_url(self):
         #print(self.pk)
         return reverse('some_url', kwargs={'pk': self.pk})

看起来在这种情况下不需要 success_url:因为你的 get_success_url() 已经覆盖了它。 - djvg

4
您可以通过以下方式从对象属性访问pk:
class SomeView(CreateView):
    """
    """

    model = Model    
    
    def get_success_url(self) -> str:
        return reverse_lazy('success', kwargs={'pk': self.object.pk})

-1

我发现了一些非常直接的东西:

views.py

class SomeView(FormView):
    ...
    context_object_name = 'object_name'
    ...

    def get_success_url(self)
        return reverse('some_url', kwargs={'pk': self.get_context_data()['object_name'].pk})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接