簡體   English   中英

使用 kwargs 的 Django 成功網址

[英]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.pkself.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM