我知道我来晚了,但这可能会帮助任何其他寻找答案的人。
在为同样的问题苦恼时,我发现了这个解决方案,它使用人类因素而不是技术因素。如果用户从CreateView提交后进入一个UpdateView,该视图显示与标题和底部按钮除外完全相同的新创建对象,则用户将不会使用返回按钮。
技术解决方案可能是创建一个模型字段来保存UUID,并创建一个作为隐藏字段传递到创建表单中的UUID。当按下提交按钮时,form_valid
可以在数据库中检查是否存在具有该UUID的对象,并拒绝创建将成为重复项的内容(unique=True
将在数据库级别强制执行)。
以下是示例代码(稍微编辑以删除雇主可能不想公开的内容)。它使用django-crispy-forms使事情变得漂亮和简单。从客户表上的按钮进入Create视图,该按钮传递客户帐号而不是其记录的Django ID。
Urls
url(r'enter/(?P<customer>[-\w]+)/$', JobEntryView.as_view(), name='job_entry'),
url(r'update1/(?P<pk>\d+)/$', JobEntryUpdateView.as_view(), name='entry_update'),
视图
class JobEntryView( LoginRequiredMixin, CreateView):
model=Job
form_class=JobEntryForm
template_name='utils/generic_crispy_form.html'
def get_form( self, form_class=None):
self.customer = get_object_or_404(
Customer, account = self.kwargs.get('customer','?') )
self.crispy_title = f"Create job for {self.customer.account} ({self.customer.fullname})"
return super().get_form( form_class)
def form_valid( self, form):
form.instance.customer = self.customer
return super().form_valid(form)
def get_success_url( self):
return reverse( 'jobs:entry_update', kwargs={'pk':self.object.pk, } )
class JobEntryUpdateView( LoginRequiredMixin, CrispyCMVPlugin, UpdateView):
model=Job
form_class=JobEntryForm
template_name='utils/generic_crispy_form.html'
def get_form( self, form_class=None):
self.customer = self.object.customer
self.crispy_title = f"Update job {self.object.jobno} for {self.object.customer.account} ({self.object.customer.fullname})"
form = super().get_form( form_class)
form.helper[-1] = ButtonHolder( Submit('update', 'Update', ), Submit('done', 'Done', ), )
return form
def get_success_url( self):
print( self.request.POST )
if self.request.POST.get('done',None):
return reverse('jobs:ok')
return reverse( 'jobs:entry_update',
kwargs={'pk':self.object.pk, } )