Он будет вызывать get_success_url
только после form_valid
. Так что до form_valid
можно создавать и сохранять необходимые объекты. Если они не созданы, вам нужен другой подход. Возможно, инициализируйте (скажем) self.campaign_pk = 0
, обновите его, если кампанию можно создать с помощью pk объекта кампании, и позвольте следующему представлению разобраться, что делать, когда pk == 0. Или,
...
args=(self.kwargs['pk'],
self.object.campaign.pk if self.object.campaign else 0,
self.object.pk))
(я не полностью следую вашему коду, поэтому я, возможно, лаю не на том дереве)
Возможно, вы не хотите CreateView
, ноFormView
, который не обрабатывает создание объектов для вас, так что вы можете найти большую гибкость в том, как обрабатывать правильную форму, которая, тем не менее, не может быть полностью соблюдена все времяИли даже просто старое, основанное на функциях представление, в котором вы можете обрабатывать две или более форм и иметь гораздо больше возможностей принимать решения об условиях, которые составляют недействительность, даже после того, как все формы технически проверены.
Это структура представления на основе функций, которую я использовал, когда у меня есть две формы для обработки и довольно длинный, но скучный набор операций, которые нужно выполнить после проверки ОБА форм:
def receive_view( request):
# let's put form instantiation in one place not two, and reverse the usual test. This
# makes for a much nicer layout with actions not sandwiched by "boilerplate"
# note any([ ]) forces invocation of both .is_valid() methods
# so errors in second form get shown even in presence of errors in first
args = [request.POST, ] if request.method == "POST" else []
batchform = CreateUncWaferBatchForm( *args, layout=CreateUncWaferBatchLayout )
po_form = CreateUncWaferPOForm( *args, layout = CreateUncWaferPOLayout, prefix='po')
if request.method != "POST" or any(
[ not batchform.is_valid(), not po_form.is_valid() ]):
return render(request, 'wafers/receive_uncoated.html', # can get this out of the way at the top
{'batchform': batchform,
'po_form': po_form,
})
#it's a POST, everything is valid, do the work
...
return redirect('appname:viewname', ...)