[英]Django UpdateView create new object
我的問題:UpdateView創建新對象而不是更新以前,我認為它的發生是因為在我的視圖的類定義中我重寫get_object方法,如下所示:
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而是創建新的 - 在這種情況下我該怎么辦? 我不希望創建新對象,如果對象的所有者不是當前用戶我不想發生任何事情然后發送這樣的發布請求。 我該如何正確實現這個?
更新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_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.
UPDATE
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', {}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.