【问题标题】:Creating cancel button on UpdateView form在 UpdateView 表单上创建取消按钮
【发布时间】:2014-02-03 05:34:06
【问题描述】:

我想在更新/编辑表单中创建一个Cancel 按钮,但我不断收到AttributeErrorexception:

'PatientUpdate' object has no attribute 'object'

查看:

class PatientUpdate(LoginRequiredMixin, UpdateView):
    model = User
    form_class = MyPatientEditForm        
    template_name = "patient/patient_edit.html"
    success_url = reverse_lazy('patient_list')

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(PatientUpdate, self).post(request, *args, **kwargs)

html:

<button class="btn" type="submit" name="cancel" value="Cancel" />Cancel</button>

追溯:

Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/braces/views.py" in dispatch
  107.             request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/Users/Maziar/Dropbox/Sandbox/tutorial/web/views.py" in post
  60.             url = self.get_success_url()
File "/Library/Python/2.7/site-packages/django/views/generic/edit.py" in get_success_url
  133.             url = self.success_url % self.object.__dict__

Exception Type: AttributeError at /patient/edit/3
Exception Value: 'PatientUpdate' object has no attribute 'object'

我到底做错了什么?此外,我考虑过是否可以在模板中获取success_url 变量,以便在按钮中简单地使用它而不执行整个POST 过程?

更新: success_url 正常提交表单时工作正常。

【问题讨论】:

  • @petkostas,不可能,因此它在成功时表单反转时起作用。
  • 问题是默认的updateview这样调用成功的url:if self.success_url: url = self.success_url % self.object.__dict__确保你有一个self.object实例self.object = self.get_object()或者只是返回一个HttpResponseRedirect和一个自定义的url无需调用self.get_success_url()

标签: django


【解决方案1】:

如果用户按下“取消”按钮,他会重定向到患者列表吗?那么为什么不创建没有任何附加逻辑的简单链接:

<a href="{% url 'patient_list' %}">Cancel</a>

【讨论】:

    【解决方案2】:

    get_success_url 取决于实际拥有该对象。试试这个:

    def post(...):
        if "cancel" in request.POST:
            self.object = self.get_object()
            # ...
    

    这样,get_success_url 将有权访问您正在编辑的实例,并且重定向应该可以工作。

    获取模板的成功 url 也应该可以:

    def get_context_data(self, **kwargs):
        kwargs['success_url'] = self.get_success_url()
        return super(..., self).get_context_data(**kwargs)
    

    【讨论】:

      【解决方案3】:

      我已经更改了 submit_line.html 模板,并且使用 request.META.HTTP_REFERER 可以返回到您来自之前的更改列表(带有过滤信息!):

      <div class="submit-row">
       {% if show_save %}
       <input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
         {% if show_delete_link %}
          {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
          <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
         {% endif %}
         {% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
         <a href="{{ request.META.HTTP_REFERER }}"><input type="button" name="Cancel" value="Cancel"></a>
         {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" name="_continue" />{% endif %}
      </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        相关资源
        最近更新 更多