【问题标题】:Django FormView pass pk in success_urlDjango FormView在success_url中传递pk
【发布时间】:2018-12-09 22:04:40
【问题描述】:

假设我有以下 FormView,并且我想在提交表单后将 item.pk 传递给其他视图。我想我必须编辑get_success_url(),但我什至不知道如何从form_valid() 获取item.pk

models.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?

【问题讨论】:

  • 当你指定它是否有效时,你真的应该避免保存一些东西。现在你基本上已经完全失效了 Django 合约,因此,有几件事可能不再正常工作。
  • 这是ModelForm吗?在这种情况下,您最好使用ModelFormView,因为这提供了更多便利。
  • 你的意思是 ModelFormMixin 吗?您可能有一个如何使用它的示例?
  • no mixin 用于“将Form 升级为ModelForm,可以这么说,但您可以让SomeForm 使用ModelForm 子类(如果它直接映射到单个模型)。
  • 说实话,你的 cmets 让我有点困惑 :-( 我更新了我的代码示例,也许这有助于理解我拥有什么以及我在寻找什么?顺便说一句 form.save() 是在许多其他答案中提到,我认为没关系。

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


【解决方案1】:

你可以像下面那样做

class SomeView(FormView):
    form_class = SomeForm
    template_name = 'appname/form.html'
    success_url = reverse_lazy('somewhere')
    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})

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2013-12-05
    • 2020-04-15
    • 2015-08-24
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2014-02-01
    相关资源
    最近更新 更多