【问题标题】:405 error after implementing new search view实施新的搜索视图后出现 405 错误
【发布时间】:2019-01-24 16:02:51
【问题描述】:

目前使用 Django 2.1、Python 3.6、PostgreSQL 11,并在 Heroku 上托管数据库。

我正在创建一个充当 GUI 数据库条目的 Web 应用程序。我最近在这里获得了一些搜索代码Django Front End Search。此代码与将服务器托管在我的机器上的测试应用程序一起使用。当我尝试与我的 Heroku 托管数据库通信时,我现在看到 405 错误。

目前,我的网络应用在donor_list.html 上列出了捐助者。我希望我的用户的查询结果在他们执行查询后发布在donor_list.html 上。

这是错误:

不允许的方法 (POST):/device/donor_list/

不允许的方法:/device/donor_list/

“POST /device/donor_list/HTTP/1.1”405 0

# Associated urls
    path('donor_list/',views.DonorList.as_view(),name='donor_list'),
    path('donor_list/',views.SearchDonor,name='donor_search'),

# Donor Model
    class Donor(models.Model):
    name=models.CharField(max_length=265,blank=False)
    email=models.EmailField(max_length=265,blank=False)
    donation_house=models.ForeignKey(DonationHouse,
                                     default='1',
                                     related_name='dono_house',
                                     on_delete=models.CASCADE)

    def __str__(self):
        return self.name

# Donor View
    class DonorList(ListView):
    context_object_name = 'donors'
    model=models.Donor

# Search Code
    def SearchDonor(request):

    keywords=''

    if request.method=='POST': # form was submitted

        keywords = request.POST.get("ds", "")
        all_queries = None
        search_fields = ('name','email','donation_house__title')
        for keyword in keywords.split(' '):
            keyword_query = None
            for field in search_fields:
                each_query = Q(**{field + '__icontains': keyword})
                if not keyword_query:
                    keyword_query = each_query
                else:
                    keyword_query = keyword_query | each_query
                    if not all_queries:
                        all_queries = keyword_query
                    else:
                        all_queries = all_queries & keyword_query

        donorsearches = Donor.objects.filter(all_queries).distinct()
        context = {'donorsearches':donorsearches}
        return render(request, 'device_app/donor_list.html', context)

    else: # no data submitted

        context = {}
        return render(request, 'device_app/index.html', context)

# donor_list.html

    {% extends 'device_app/base.html' %}
    {% block body_block %}
    <div class="jumbotron">
    <h1>Donor List</h1>
    <p><a class="button" href="{% url 'device_app:donor_create'%}">
    Create  Donor</a>
    </p>
    <form method="POST" action=".">
          {% csrf_token %}
    <input id="search_box" type="text" name="ds"  placeholder="Search..." >
    <button class="button" type="submit" >Submit</button>
    </form>
    <br>
      {{donorsearches}}
    <br>
    <ul>
    {% for donor in donors %}
    <h6>
      <li>
        <a class="annoying" href="{{donor.id}}">{{donor.name}}</a>
      </li>
    </h6>
    {% endfor %}
    </ul>
    </div>
    {% endblock %}

【问题讨论】:

  • 您的 SearchDonor 网址在哪里? HTML 表单发布到错误的位置,即 DonorList。
  • @Daniel 我已经添加了网址。我希望在查询后将搜索结果添加到donor_list 页面。
  • 看起来我尝试使用的格式导致了问题。现在工作正常。感谢您的帮助。

标签: django python-3.x heroku django-views heroku-postgres


【解决方案1】:

如果您希望搜索结果显示在同一页面上,您需要将它们放在同一视图中,而不是单独的视图。

class DonorList(ListView):
    context_object_name = 'donors'
    model=models.Donor

    def post(self, request):
        keywords = request.POST.get("ds", "")
        all_queries = None
        search_fields = ('name','email','donation_house__title')
        for keyword in keywords.split(' '):
            ...

请注意,搜索通常使用 GET 请求,而不是 POST。

【讨论】:

  • 现在我可以让页面运行,但是我的 html 没有产生我的查询结果。我应该如何更改{{捐助者搜索}}?
  • 您不需要更改它。您是否以与原始代码相同的方式呈现模板?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2020-10-20
  • 2019-07-31
  • 2022-08-14
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多