Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-保存并添加其他功能_Python_Django_Web_Django Templates_Django Views - Fatal编程技术网

Python Django-保存并添加其他功能

Python Django-保存并添加其他功能,python,django,web,django-templates,django-views,Python,Django,Web,Django Templates,Django Views,我正在尝试在Django应用程序中编程“保存并添加另一个”功能 我给按钮加了一个elif条件。我在网上找不到任何有用的资源和参考资料,尤其是我的代码集。我已经尝试在elif中输入两个返回值,并将self.object片段放入其中。有什么建议我能做什么?我对Django很陌生。请帮忙 视图.py def post(self, request, *args, **kwargs): if "cancel" in request.POST: return HttpResponse

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

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

视图.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)
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'),
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>

取消
提交
保存并添加另一个
url.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)
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'),
urlpatterns=[
url(r'^$',views.IndexView.as_view(),name='index'),
url(r'^(?P[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'),

我更愿意为您创建两个通用类一CreateView和RedirectView。CreateView具有保存对象(post)和返回默认页面的方法,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>

{%形式的字段为%}
{{field.label_tag}
{%if field.help_text%}
{{field.help_text}
{%endif%}
{{field.errors}}
{{field}}
{%endfor%}
保存并添加另一个
癌变
我假设您对在“保存”和“添加新内容”中执行两项操作感到困惑。因此,我将从您编写的内容开始:

  • 取消,只是重定向到另一个页面或您的主页(或任何其他页面)
  • 保存。也是一种保存并重定向到主页(或任何其他页面)的方法
  • 保存并添加另一个,是保存并重定向到同一页面
  • 我认为您应该在
    视图.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)
    
    还有一个更好的版本遵循干式原理。你可以这样做:谢谢@bruno的评论

    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
    
    “保存并添加另一个”功能只是重定向到同一页面,而不是重定向到默认的
    success\u 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\u success\u url()
    -只有在发布成功时才会调用该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()
    

    cancel按钮有效吗?两次返回根本没有意义。你到底想让这个功能做什么?你不想重定向回同一个页面,这样用户就可以再次填写空表单吗?首先,你应该了解return语句的作用,因为这绝对是basicHi@InesTlili,是的,cancel语句按钮工作正常。:)嗨@DanielRoseman,是的,这正是我的目标,但我在网上找不到任何符合我的逻辑和代码的有用资源。你仍然有两次调用
    super(employeeCreate,self)。post()
    在两个分支中,这不是干巴巴的。你可以很容易地避免这种情况。是的,我同意。我更新了我的答案。我的想法是,我认为用相同的风格编写他的代码,指出问题,会更好地向他解释问题。谢谢@AhmedHosny,谢谢你的帮助。我对这项技术非常熟悉。你能指导我吗如果你的答案像个哑巴?拜托?我真的想知道你的答案发生了什么,只是语法和代码结构让我很困惑。这些代码做什么,请帮助?:)如果有任何错误,比如表单验证失败,你应该显示它们,而不是无声重定向。如果保存动作.status,我建议谓词为
    _code==http.HTTPStatus.FOUND和request.POST中的“other”。此外,在大多数情况下,用户可能只想停留在同一个创建页面上。在这种情况下,可以简单地使用
    HttpResponseRedirect(request.path\u info))
    。您好@GGG205,谢谢您的回答,但我使用的是使用{field.label\u tag}的通用表单模板{{field}}功能。我该如何将其融入我的工作中?:)非常感谢@Brunodesshuilliers,这个答案很有效,谢谢你的帮助。我对这项技术非常了解。你能像一个傻瓜一样引导我完成你的答案吗?请?我真的想知道你的答案发生了什么,只是语法和代码结构让我困惑。你知道什么这些代码可以,请帮助。:)