【问题标题】:Django - Save and add another functionalityDjango - 保存并添加另一个功能
【发布时间】:2019-01-24 05:15:01
【问题描述】:

我正在尝试在我的 Django 应用程序中编写“保存并添加另一个”功能。

我给按钮添加了一个 elif 条件。我在网上找不到任何有用的资源和参考资料,尤其是我的代码集。我已经尝试在 elif 中放入两个返回并将 self.object sn-p 放入其中。有什么建议我能做什么?我对 Django 很陌生。请帮忙。

Views.py

def post(self, request, *args, **kwargs):
    if "cancel" in request.POST:
        return HttpResponseRedirect(reverse('skillsMatrixApp:index'))
    elif "another" in request.POST:
        #try 1
        #self.object = self.get_object()
        #url = self.get_success_url()
        #return HttpResponseRedirect(url)

        #try 2 
        #return HttpResponseRedirect(reverse('skillsMatrixApp:employee-add'))
        #return super(employeeCreate, self).post(request, *args, **kwargs)
    else:
        return super(employeeCreate, self).post(request, *args, **kwargs)

employee_form.html

<div class="col-sm-offset-2 col-sm-10">
    <button type="submit" formnovalidate name="cancel" class="btn btn-danger">Cancel</button>
    <button type="submit" formnovalidate class="btn btn-success">Submit</button>
    <button type="submit" formnovalidate name="another" class="btn btn-danger">Save and add another</button>
</div>

urls.py

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'employee/$', views.employeeList.as_view(), name='employee-list'),
    url(r'employee/add/$', views.employeeCreate.as_view(), name='employee-add'),

【问题讨论】:

  • 取消按钮有用吗?
  • 两次返回是没有意义的。你到底想要这个功能做什么?您不只是想重定向回同一页面,以便用户可以再次填写空表单吗?
  • 首先你应该了解 return 语句的作用,因为这绝对是基本的
  • 嗨@InesTlili,是的,取消按钮工作得很好。 :)
  • 嗨@DanielRoseman,是的,这正是我的目标,但我在网络上找不到任何适合我的逻辑和代码的有用资源。

标签: python django web django-templates django-views


【解决方案1】:

我假设您对在保存和添加新内容中做两件事感到困惑。所以,我将从你写的开始:

  1. 取消,只是重定向到另一个页面或您的主页(或任何其他页面)。
  2. 保存。是保存并重定向到您的主页(或任何其他页面)
  3. Save and Add another,是一个保存并重定向到同一个页面。

我认为您应该在views.py 中执行以下操作

def post(self, request, *args, **kwargs):
    if "cancel" in request.POST:
        return HttpResponseRedirect(reverse('skillsMatrixApp:index'))
    elif "another" in request.POST:
        # You can call the super to invoke the functionality without
        # returning the result.
        super(employeeCreate, self).post(request, *args, **kwargs)
        return HttpResponseRedirect(reverse('skillsMatrixApp:employee-add'))
    else:
        return super(employeeCreate, self).post(request, *args, **kwargs)

遵循 DRY 原则的更好版本。你可以这样做:感谢@bruno cmets

def post(self, request, *args, **kwargs):
    save_action = None
    if "cancel" in request.POST:
        return HttpResponseRedirect(reverse('skillsMatrixApp:index'))
    else:
        save_action = super(employeeCreate, self).post(request, *args, **kwargs)

    if "another" in request.POST:
        return HttpResponseRedirect(reverse('skillsMatrixApp:employee-add'))
    return save_action

【讨论】:

  • 您仍然在两个分支中对super(employeeCreate, self).post() 进行了两次调用,这不是 DRY。你可以很容易地避免这种情况。
  • 是的,我同意。我已经更新了我的答案。我的想法是,我认为用与指出问题相同的风格编写他的代码,可以更好地向他解释事情。
  • 谢谢@AhmedHosny,谢谢你的帮助。我对这项技术真的很陌生,你能像傻瓜一样指导我完成你的答案吗?请?我真的很想知道你的答案发生了什么,只是语法和代码结构让我感到困惑。这些代码有什么作用,请帮忙? :)
  • 如果出现任何错误,例如表单验证失败,您应该显示它们而不是静默重定向。我建议谓词为if save_action.status_code == http.HTTPStatus.FOUND and "another" in request.POST
  • 另外,在大多数情况下,用户可能只想留在同一个创建页面。在这种情况下可以简单地使用HttpResponseRedirect(request.path_info))
【解决方案2】:

“保存并添加另一个”功能只是重定向到同一页面而不是重定向到默认的success_url。您可以在 post() 方法本身中执行此操作,即:

def post(self, request, *args, **kwargs):
    if "cancel" in request.POST:
        return HttpResponseRedirect(reverse('skillsMatrixApp:index'))

    next = super(employeeCreate, self).post(request, *args, **kwargs)
    if "another" in request.POST:
        next = HttpResponseRedirect(reverse('skillsMatrixApp:employee-add'))
    return next

但是,如果表单未通过验证,这将无法按预期工作(在这种情况下,表单应该重新呈现并出现错误)。更好的解决方案是覆盖 get_success_url() - 只有在帖子成功时才会调用它 - 并在此处检查 self.request.POST

class YourView(...):
    def post(self, ...):
        if "cancel" in request.POST:
            return HttpResponseRedirect(reverse('skillsMatrixApp:index'))
        return super(...).post(...)


    def get_success_url(self):
        if "another" in self.request.POST:
            return reverse('skillsMatrixApp:employee-add')
        # else return the default `success_url`
        return super(...).get_success_url()

【讨论】:

  • 非常感谢@BrunoDesthuilliers,这个答案有效,感谢您的帮助。我对这项技术真的很陌生,你能像傻瓜一样指导我完成你的答案吗?请?我真的很想知道你的答案发生了什么,只是语法和代码结构让我感到困惑。这些代码是做什么的,请帮忙。 :)
【解决方案3】:

我更喜欢为你创建两个通用类,一个 CreateView 和 RedirectView。 CreateView 具有保存对象(发布)并返回默认页面的方法,而 RedirectView 具有设置取消 url 的方法。接下来在 html 表单中,您可以设置一些表单并向按钮添加操作。例如

 <form action="{% url 'create_view' %}" method="post">
      {% for field in form %}   
        {{ field.label_tag }}
        {% if field.help_text %}
          <sup>{{ field.help_text }}</sup>
        {% endif %}
         {{ field.errors }}
         {{ field }}
     {% endfor %}
      <button type="submit">Save and add another</button><br>
      <button type="submit" formaction="{% url 'redirect_url' %}">Cancle</button>
    </form>

【讨论】:

  • 您好 @GGG205,感谢您的回答,但我使用的是通用表单模板,使用的是 {{ field.label_tag }} {{ field }} 功能。我如何将其融入我的工作中? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2011-01-13
  • 1970-01-01
  • 2014-11-18
  • 2022-01-22
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多