[英]Django success url using kwargs
我正在嘗試修改我的get_success_url
以便如果任何kwargs
已傳遞給它,我可以使用它們構建返回的 url。
這是我到目前為止所擁有的:
class CalcUpdate(SuccessMessageMixin, UpdateView):
model = Calc
template_name = 'calc/cru_template.html'
form_class = CalcForm
def archive_calc(self, object_id):
model_a = Calc.objects.get(id = object_id)
model_b = Calc()
for field in model_a._meta.fields:
setattr(model_b, field.name, getattr(model_a, field.name))
model_b.pk = None
model_b.save()
self.get_success_url(idnumber = model_b.pk)
def form_valid(self, form):
#objects
if self.object.checked == True:
object_id = self.object.id
self.archive_calc(object_id)
#save
def get_success_url(self, **kwargs):
if kwargs != None:
return reverse_lazy('detail', kwargs = {'pk': kwargs['idnumber']})
else:
return reverse_lazy('detail', args = (self.object.id,))
到目前為止,這只是給出了一個詳細說明'idnumber'
keyerror
'idnumber'
。
我已經打印了kwargs['idnumber']
並且它按預期返回了pk
但是我似乎看不出我哪里出錯了。
提前致謝。
form_valid
應該返回一個HttpResponseRedirect
https://github.com/django/django/blob/master/django/views/generic/edit.py#L57 ,在你的情況下,你永遠不會這樣做。 我不知道你在#save
之后是否有任何代碼,但是看看我在你的代碼中做出的評論
class CalcUpdate(SuccessMessageMixin, UpdateView):
model = Calc
template_name = 'calc/cru_template.html'
form_class = CalcForm
def archive_calc(self, object_id):
model_a = Calc.objects.get(id = object_id)
model_b = Calc()
for field in model_a._meta.fields:
setattr(model_b, field.name, getattr(model_a, field.name))
model_b.pk = None
model_b.save()
return self.get_success_url(idnumber = model_b.pk) # you never return this value
def form_valid(self, form):
#objects
if self.object.checked == True:
object_id = self.object.id
return HttpResponseRedirect(self.archive_calc(object_id)) # you never return a `HttpResponse`
#save -- If this is where you are saving... you can store the value from archive and return it after saving
def get_success_url(self, **kwargs):
if kwargs != None:
return reverse_lazy('detail', kwargs = {'pk': kwargs['idnumber']})
else:
return reverse_lazy('detail', args = (self.object.id,))
您也不需要手動復制字段,只需這樣做(假設沒有unique
約束,因為如果有,您的版本也會失敗):
def archive_calc(self, object_id):
c = self.model.objects.get(id = object_id)
c.pk = None
c.save()
return self.get_success_url(idnumber = c.pk)
在使用@Ngenator的答案和其他各種帖子后,我有以下工作代碼。 然而它看起來不是很好:(
def get_success_url(self):
if self.pknumber != None:
return reverse_lazy('pstdetail', args = (self.pknumber,))
else:
return reverse_lazy('pstdetail', args = (self.object.id,))
我在視圖中的必要位置有self.pknumber = model_b.pk
和self.pknumber = None
其他在哪里啟用if語句來構建所需的url。 希望這可以幫助任何人,並隨時指出任何錯誤/改進。
https://ccbv.co.uk/projects/Django/4.0/django.views.generic.edit/UpdateView/
您不能在get_success_url(self)
方法中傳遞參數。 您只能參考self
參數。 例如self.kwargs['pk']
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.