Django FormView 在 success_url 中传递 pk
Django FormView pass pk in success_url
假设我有以下 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?
你可以像下面那样做
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})
我发现了一些非常直接的东西:
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})
假设我有以下 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?
你可以像下面那样做
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})
我发现了一些非常直接的东西:
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})