【问题标题】:POST method of FormView in Django?Django中FormView的POST方法?
【发布时间】:2018-02-15 18:51:19
【问题描述】:

编辑:当用户提交用户进行搜索时,我只是使用了一个新列表,尽管我不确定如何在我的 QueryUser 类中获取提交的用户(24 的 id 只是一个测试,哦,我试过了添加分页但将其撕掉,因为当有人单击新页面时它会中断,会返回到下面发布的 Query.html,酥脆的表单不是返回的数据)

class QueryUser(LoginRequiredMixin, FormView):
    model = OnSiteLog
    form_class = QueryForm
    template_name = 'log/query.html'
    success_url = '/'
    def form_valid(self, form, *args, **kwargs):
        user = form.cleaned_data.get('user')

    def post(self, request, *args, **kwargs):
        object_list = OnSiteLog.objects.filter(user_id=24).order_by('-checkIn')
        super(QueryUser, self).post(request, *args, **kwargs)
        page = request.GET.get('page', 1)

        paginator = Paginator(object_list, 10) # 3 posts in each page
      #make a map into the object list
      
        try:
            log_pages = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer deliver the first page
            log_pages = paginator.page(1)
        except EmptyPage:
            # If page is out of range deliver last page of results
            log_pages = paginator.page(paginator.num_pages)

        return render(request, 'log/query2.html', {'page':page, 'log':object_list, 'object_list':log_pages})

我想了解基于类的视图在 Django 中的工作原理。我有View 的下一个工作代码。我想在FormView 的帮助下编写该代码。我的 `FormView 代码是否正确?我需要有人可以分析该代码并说出我的错误在哪里。如果有任何帮助,我将不胜感激。

现在get method 有效。问题是当我尝试submit 表单时。表格不会消失。同时在控制台中我看到了这个网址:"POST /url/ HTTP/1.1" 200 1891。在数据库中,我看到创建了新文章。如何解决post method 这个奇怪的问题?

带视图的 CBV:

class ArticleCreateView(FormView):
    template_name = 'article/create_article.html'
    form_class = ArticleForm

    def post(self, request):
        data = dict()
        article_create_form = ArticleForm(request.POST, request.FILES)
        if article_create_form.is_valid():
            article_create_form.save()
            data['form_is_valid'] = True
            context = {
                'articles': Article.objects.all()
            }
            data['html_articles'] = render_to_string(
                'article/articles.html',
                context
            )
        else:
            data['form_is_valid'] = False
        return JsonResponse(data)

    def get(self, request):
        data = dict()
        article_create_form = ArticleForm()
        context = {
            'article_create_form': article_create_form
        }
        data['html_article_create_form'] = render_to_string(
            'article/create_article.html',
            context,
            request=request
        )
        return JsonResponse(data)

带有 FormView 的 CBV:

class ArticleCreateView(FormView):
    template_name = 'article/create_article.html'
    form_class = ArticleForm
    form_dict = {
        'Article_create_form': ArticleForm
    }

    def get(self, request):
        data = dict()
        context = {'article_create_form': ArticleForm()}
        data['html_article_create_form'] = render_to_string(
            'article/create_article.html', context, request=request
        )
        return JsonResponse(data)

    def form_valid(self, form):
        data = dict()
        self.object = form.save()
        context = {'articles': Article.objects.all()}
        data['html_articles'] = render_to_string(
            'article/articles.html',
            context
        )
        return JsonResponse(data)

编辑文章表单查看代码:

class ArticleEditView(FormView):
    template_name = 'article/edit_article.html'
    form_class = ArticleForm

    def get(self, request, pk):
        data = dict()
        context = {
            'article': Article.objects.get(pk=pk),
            'article_edit_form': ArticleForm(instance=Article.objects.get(pk=pk))
        }
        data['html_article_edit_form'] = render_to_string(
            'article/edit_article.html', context, request=request
        )
        return JsonResponse(data)

    def form_valid(self, form):
        form.save()
        data = dict()
        data['form_is_valid'] = True
        context = {'articles': Article.objects.all()}
        data['html_articles'] = render_to_string('article/articles.html', context)
        return JsonResponse(data)

错误:

Traceback (most recent call last):
  File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 215, in _get_response
    response = response.render()
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/response.py", line 107, in render
    self.content = self.rendered_content
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/response.py", line 84, in rendered_content
    content = template.render(context, self._request)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
    return self.template.render(context)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/base.py", line 207, in render
    return self._render(context)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
    return self.nodelist.render(context)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/base.py", line 990, in render
    bit = node.render_annotated(context)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
    return self.render(context)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/template/defaulttags.py", line 458, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/srv/envs/py27/lib/python2.7/site-packages/django/urls/base.py", line 91, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/srv/envs/py27/lib/python2.7/site-packages/django/urls/resolvers.py", line 497, in _reverse_with_prefix
    raise NoReverseMatch(msg)
NoReverseMatch: Reverse for 'article_edit' with arguments '('',)' not found. 1 pattern(s) tried: [u'administration/article/(?P<pk>\\d+)/edit/$']

articles.html:

{% for article in articles %}
<div class="list-group-item" data-id='{{ article.id }}'>
   <button class="btn slideEditBtn" data-url="{% url 'article:article_edit' pk=slide.id %}">
        <i class="fa fa-pencil" aria-hidden="true"></i>
    </button>
</div>
{% endfor %}

【问题讨论】:

  • 请显示您的代码article/articles.html
  • articles.html 文件中没有什么特别之处。我只是在模板中显示文章列表。 {% for article in articles %} {{article.title}} {% endfor %}
  • 在上下文中你有article 没有s 可能是它?
  • 当我发布这个问题时,这是一个错字。事实上,在那个地方我使用文章。所以问题不在那个地方。您还有其他想法吗?

标签: python django python-2.7 django-views django-1.11


【解决方案1】:

当您的表单有效时,您将返回数据的 JsonResponse。您想要的是将用户重定向到带有一些消息的页面。

使用重定向! https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/#redirect

一些简单的事情,例如:

return redirect('form-thankyou')

当然还要添加一个带有名称为form-thankyou 的url 的urlpattern

【讨论】:

  • 我需要把这段代码放在哪里?用什么方法?我有点困惑=(
  • 例如在CBV with View 中,如果使用ajax 更新文章列表并关闭表单,则post 方法成功。但在CBV with FormView 形式中不会消失。你对此有什么想法吗?
【解决方案2】:

这个问题与您的观点没有任何关系。您发送 json 响应的事实意味着您在这里使用 Ajax;这意味着您已明确承担将页面从浏览器中更改出来的责任。

您的 Ajax 脚本需要在成功提交时执行一些操作。

【讨论】:

  • 我认为你是对的。问题可能与 JS 脚本有关。你能再看看我的帖子吗?我用 JS 代码更新它。
【解决方案3】:

您忘记将form_is_valid 添加到data

def form_valid(self, form):
    data = dict()
    self.object = form.save()
    context = {'articles': Article.objects.all()}
    data['html_articles'] = render_to_string(
        'article/articles.html',
        context
    )
    # NEXT LINE
    data['form_is_valid'] = True
    return JsonResponse(data)

【讨论】:

  • 谢谢!你是对的!我想念那条线。但我偷有问题。我对我的编辑表单使用相同的form_valid method。但它会引发错误。你能再检查一下帖子吗?! =)
  • 对于你最后一个错误需要模板代码,我认为你更好的开放新问题更具可读性。
  • 我认为form_valid method 的问题。当我提交编辑表单时,它会引发错误,您可以在帖子中看到。
猜你喜欢
  • 2015-03-09
  • 2018-10-03
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多