Python Django UpdateView创建新对象
我的问题是: UpdateView创建新对象而不是更新以前的对象,我认为这是因为在我的视图的类定义中,我重写了get_对象方法,如下所示:Python Django UpdateView创建新对象,python,django,django-class-based-views,Python,Django,Django Class Based Views,我的问题是: UpdateView创建新对象而不是更新以前的对象,我认为这是因为在我的视图的类定义中,我重写了get_对象方法,如下所示: def get_object(self, queryset=None): try: object_get = self.model.objects.get(pk=self.kwargs['pk']) except ObjectDoesNotExist: raise Http404("No object foun
def get_object(self, queryset=None):
try:
object_get = self.model.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("No object found matching this query")
if self.request.user.is_authenticated():
if object_get.owner == self.request.user:
return object_get
因此,如果当前用户不是对象的所有者-此方法不返回任何内容-这就是我想要的,但我的表单类会创建新对象:
class ClientCreation(forms.ModelForm):
class Meta:
model = Client
fields = ('name', 'loyal')
我认为这是因为表单不接收self.instance并创建新实例——在这种情况下我应该怎么做?我不希望创建新的对象,以防当对象的所有者不是当前用户时,我不希望发生任何事情,然后发送这样的post请求。我应该如何正确地实现这一点
更新views.py:
class Distinct(generic.UpdateView):
def get_object(self, queryset=None):
try:
object_get = self.model.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("No object found matching this query")
if self.request.user.is_authenticated():
if object_get.owner == self.request.user:
return object_get
def get_form_kwargs(self):
kwargs = super(Distinct, self).get_form_kwargs()
if self.request.user.is_authenticated():
kwargs.update({'user': self.request.user})
return kwargs
def post(self, request, *args, **kwargs):
if request.POST.get('action', '') == 'Delete':
object_get = self.get_object()
request.session['deleted_data'] = str(object_get)
object_get.delete()
return redirect(reverse('crm:main'))
else:
return super(Distinct, self).post(request, *args, **kwargs)
def get_success_url(self):
return reverse('crm:{}'.format(self.distinct_template), kwargs={'pk': self.kwargs['pk']})
class DistinctClient(Distinct):
form_class = ClientCreation
model = Client
template_name = 'crm/client_detail.html'
all_template = 'clients'
distinct_template = 'client'
def get_form_kwargs(self):
return generic.UpdateView.get_form_kwargs(self)
在
UpdateView
中,如果get\u object
返回None
django将创建一个新对象。因此,不要返回None
,而是执行任何您想要的操作
def get_object(self, queryset=None):
try:
object_get = self.model.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("No object found matching this query")
if self.request.user.is_authenticated():
if object_get.owner == self.request.user:
return object_get
raise My #do something here.
更新
class My(Exception):
pass
class DistinctClient(Distinct):
form_class = ClientCreation
model = Client
template_name = 'crm/client_detail.html'
all_template = 'clients'
distinct_template = 'client'
def dispatch(self, *args, **kwargs):
try:
return super(DistinctClient, self).dispatch(*args, **kwargs)
except My:
return redirect #to do or (return render(self.request, 'mytemplate.html', {}))
那么你也可以在onwer不是当前用户或不是当前用户时引发404?你能提供完整的类代码吗?@MosesKoledoye我不想引发任何错误我的模板上有正确的消息,然后它没有收到对象我应该引发什么异常才能将我的模板发送给用户,我试图提高PermissionDenied,但在这种情况下,我只是得到了403禁止不是我的临时页面谢谢-什么工作,但我认为它应该返回super(DistinctClient,self)。dispatch(*args,**kwargs),而不是super(DistinctClient,self)。dispatch(*args,**kwargs),因为没有返回,我得到了一个错误。是的,我错过了。